2017-09-01 111 views
0

我在Python編寫的腳本保存的數據刮分佈在多個頁面從網頁的某些產品的不同子分類鏈接,並保存在不同的表(將其命名爲根據標題的產品)在Excel文件中。在這種情況下,我使用了「pyexcel」。首先,刮板應該將該網頁中的「item_list」和「所有品牌」的名稱進行比較。無論何時,找到匹配它會颳去該鏈接,然後追查和分析所有的子類別鏈接遍歷多個頁面,並保存在一個Excel文件,我在前面已經說。如果這些產品不分散在多個頁面上,它將毫無錯誤地運行。但是,我在「item_list」中選擇了三個已分頁的「項目」。刮板拋出錯誤,同時從多個頁面

當我執行我的腳本,它拋出下面的錯誤。但是,我注意到有了這個錯誤,一個包含來自單個頁面的子類別鏈接的項目就被完成了。它會在保存子類鏈接下一頁的數據時拋出錯誤。我該如何解決這個問題?提前致謝。

以下是完整的腳本:

import requests ; from lxml import html 
from pyexcel_ods3 import save_data 

core_link = "http://store.immediasys.com/brands/" 
item_list = ['Adtran','Asus','Axis Communications'] 

def quotes_scraper(base_link, pro): 

    response = requests.get(base_link) 
    tree = html.fromstring(response.text) 
    data = {} 
    for titles in tree.cssselect(".SubBrandList a"): 
     if titles.text == pro: 
      link = titles.attrib['href'] 
      processing_docs(link, data) #--------#Error thrown here#----- # 

def processing_docs(link, data): 

    response = requests.get(link).text 
    root = html.fromstring(response) 
    sheet_name = root.cssselect("#BrandContent h2")[0].text 

    for item in root.cssselect(".ProductDetails"): 
     pro_link = item.cssselect("a[class]")[0].attrib['href'] 
     data.setdefault(sheet_name, []).append([str(pro_link)]) 
    save_data("mth.ods", data) 

    next_page = root.cssselect(".FloatRight a")[0].attrib['href'] if root.cssselect(".FloatRight a") else "" 
    if next_page: 
     processing_docs(next_page) 

if __name__ == '__main__': 
    for item in item_list: 
     quotes_scraper(core_link , item) 

錯誤我遇到:

Traceback (most recent call last): 
    File "C:\Users\ar\AppData\Local\Programs\Python\Python35-32\goog.py", line 34, in <module> 
    quotes_scraper(core_link , item) 
    File "C:\Users\ar\AppData\Local\Programs\Python\Python35-32\goog.py", line 15, in quotes_scraper 
    processing_docs(link, data) 
    File "C:\Users\ar\AppData\Local\Programs\Python\Python35-32\goog.py", line 30, in processing_docs 
    processing_docs(next_page) 
TypeError: processing_docs() missing 1 required positional argument: 'data' 

順便說一句,如果我沒有「pyexcel」運行此腳本,它不會遇到任何問題,在所有。我遇到的錯誤是因爲寫入和保存數據。

回答

1

看你的代碼,我想我可以看到你的問題:

def processing_docs(link, data): 

    response = requests.get(link).text 
    root = html.fromstring(response) 
    sheet_name = root.cssselect("#BrandContent h2")[0].text 

    for item in root.cssselect(".ProductDetails"): 
     pro_link = item.cssselect("a[class]")[0].attrib['href'] 
     data.setdefault(sheet_name, []).append([str(pro_link)]) 
    save_data("mth.ods", data) 

    next_page = root.cssselect(".FloatRight a")[0].attrib['href'] if root.cssselect(".FloatRight a") else "" 
    if next_page: 
     processing_docs(next_page) # this line here! 

你的函數processing_docs需要兩個參數,但你只有一個遞歸(processing_docs(next_page))調用它。我想你想要遞歸地將data字典傳遞給函數,以便繼續添加它? (雖然這可能是錯誤的 - 一眼,好像它會保存第1頁,然後保存1,2頁然後保存1,2和3頁..但我不得不仔細看可以肯定的)

關於你的第二個問題(在評論)

有你能做到這幾個方面。

要保存使用save_data("mth.ods", data)您的數據,如果我理解你的代碼 - 如果不是這樣,你通過了項目名稱爲processing_docs功能:

def processing_docs(link, data, item): 
    .... 
    save_data(item + ".ods", data) 

調用此:

for titles in tree.cssselect(".SubBrandList a"): 
    if titles.text == pro: 
     link = titles.attrib['href'] 
     processing_docs(link, data, pro) 

if next_page: 
    processing_docs(next_page, data, item) 

然後它會生成一個新文件每個項目都以該項目命名。


額外

你遞歸的用途是效率會低一點 - 我認爲它會工作,因爲它會寫P1,然後寫P1和P2,然後寫P1-3,所以你最終會與整個事情(除非數據中的某些內容被覆蓋,但我不這麼認爲)。

也許更能將僅保存數據,如果你需要在移動到下一個頁面,如

if next_page: 
    processing_docs(next_page, data, item) 
else: 
    save_data(item + ".ods", data) # move here and take out elsewhere 

你可能要繞一點發揮得到那個工作,但是如果你的數據集很大,它會更快一點。

+0

看起來像你發現的問題。當我完成時回到你身邊。謝謝Stael。 – SIM

+0

你做了我的一天,男人!我可以問一個簡單的問題嗎? – SIM

+0

是的,繼續。 – Stael