2016-11-29 61 views
0

我有在Python的Web刮痧某個特定的問題。背景是我想要取消所有食物食譜http://www.bbc.co.uk/food/recipes/!現在,下面是我在一個單一的食譜代碼Python網絡刮痧錯誤10053

def extract_all_information(): 
file_name='links_all_recipes.txt' 
links=read_all_links(file_name) 
count=1 
counter=0 
for link in links: 
    Recipes=open('All_Recipes.txt','a',encoding='utf-8') 
    url='http://'+link 
    single_recipe=recipe.collect_all_information(url) 
    Recipes.write(str(single_recipe)) 
    Recipes.write('\n') 
    counter+=1 
    if counter>20: 
     counter=0 
     time.sleep(2) 
    count+=1 
    Recipes.close() 

提取信息(如作者)的代碼是這樣的:

from bs4 import BeautifulSoup 
import requests 
def extract_author(recipe_url): 
recipe=requests.get(recipe_url) 
rsoup = BeautifulSoup(recipe.text, "lxml") 
result = '' 
for tag in rsoup.find_all(itemprop='author'): 
    result = tag.contents[0] 
return result 

你可以假設所有其他功能(如Extract_cooking_time()和extract_preparation_time()等類似上述功能),最終,我把所有這些功能(其中提取物()在collect_all_information相關的配方)的特定信息,以提取與單一配方的一切,我把這個函數collect_all_information在每個Url的循環中!每一次,我提取所有相關的特定配方的信息,我附上此信息到一個名爲Recipes.txt

現在文件,說我遇到的問題是,下面

ConnectionError的錯誤: ('Connection Aborted。',ConnectionAbortedError(10053,'已建立的連接被您的主機中的軟件中止',None,10053,None))

這個錯誤出現在我下載大約1000個食譜之後11,000個食譜,我想要全部下載/下載,我有所有食譜的鏈接,並且在每個食譜中,我提取一些信息,如烹飪時間,準備時間,作者,成分等等),我尋找類似的答案,但每個答案都表示這個錯誤可能是由於不同的原因。這是我的直覺,我認爲這個錯誤在某種程度上與單位時間內報廢的最大數據量有關(意味着超出限制),我想我應該解決這個問題(我已經試圖在報廢后2秒的時間內做到這一點20食譜每個,但仍然收到此錯誤)!

只是一些更多的信息,我使用BeautifulSoup 4和Python 3,Windows 10!有人可以如此友好地告訴我我有這個錯誤的原因,我應該修改我的代碼來解決它。只要容易理解和實現,您的解決方案就可以是任何東西,請注意,我試圖使用Package'retry',但我無法確定我應該如何使用它,以及我應該在哪裏使用它代碼!所以,你也可以在你的答案中包括這個!

爲了清楚起見,我維護變量'count'來告訴我問題出現在哪裏,我在將文本附加到文本文件之前打印出來(經過多次迭代後會發生這種問題)!我追加在該文件中,這樣即使就這樣產生了一個問題,至少我下載一些菜譜,並在我的硬件救了他們 -

預先感謝您很多時間

+0

順便說一句:你可以編輯問題和添加文本的問題,而不是評論。 – furas

+0

您有連接問題,因此連接到服務器的代碼在哪裏?你顯示的代碼在你的問題中是無用的。並始終顯示完整的錯誤信息(Traceback)可以有其他有用的信息 - 即。哪一行出問題。 – furas

+0

請看現在的代碼,至於追溯,我真的很抱歉,但我不小心關閉了輸出,現在我不得不再次運行它,等待幾乎一個小時才能得到這個錯誤,所以... –

回答

0

試試這個:

def extract_author(recipe_url): 
    recipe = requests.get(recipe_url, headers={"user-agent":"Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"}) 
    rsoup = BeautifulSoup(recipe.text, "lxml") 
    meta = rsoup.find("div",{"class":"recipe-leading-info"}) 
    desc = meta.find("p", {"itemprop":"description"}) 
    author = meta.find("a",{"itemprop":"author"}) 
    ingredients = [(list(x.strings)[0], list(x.strings)[1]) for x in rsoup.findAll("li", {"itemprop":"ingredients"})] 


    infodct = dict(Author=author, Description=desc, Ingredients=ingredients) 
    print(infodct) 

extract_author(recipe_url=link) 

我看起來像忘了指定「a」標籤。我用這個網址來測試:「http://www.bbc.co.uk/food/recipes/bananabread_85720

你不需要findAll,除非你希望返回多個標籤,就像它是一個作者列表一樣。它也可能會減少一些處理時間,就像將所有提取功能合併在一起一樣。否則,你告訴解析器爲每一個信息請求。只需提出一個請求並拉出所有內容。另外,設置用戶代理標題通常是一個好習慣。我通常遇到這種情況是請求錯誤的最常見原因。