我在Python Web Scrapping中遇到了一些问题。背景是我要废弃http://www.bbc.co.uk/food/recipes/上的所有食谱!现在,下面是我的代码
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()中提取与单个配方相关的所有内容,我在循环中为每个Url调用此函数collect_all_information!每次,我提取与特定配方相关的所有信息,我将此信息附加到名为Recipes.txt的文件
现在,我遇到的问题是,下面的错误
ConnectionError :('Connection aborted。',ConnectionAbortedError(10053,'已建立的连接被主机中的软件中止',无,10053,无))
这个错误来自我下载大约1000个食谱(总共有11,000个食谱,我想要废弃/下载所有食谱,我有所有食谱的链接,在每个食谱上,我提取一些信息,如烹饪时间,准备时间,作者,成分等),我已经找到了相似的答案,但每个答案都说这个错误可能是由于不同的原因造成的。这是我的直觉,我认为这个错误在某种程度上与单位时间内报废的数据的最大数量有关(超出意味着限制),我想我应该解决这个问题(我已经尝试过这样做,在报废后2秒的时间内睡眠每个20个食谱,但仍然收到此错误)!
更多信息,我正在使用BeautifulSoup 4和Python 3,Windows 10!有人可以这么好地告诉我我遇到这个错误的原因,以及我应该在我的代码中修改什么来解决它。你的解决方案可以是任何东西,只要它易于理解和实现,请注意我尝试使用包'重试',但我无法弄清楚我应该如何使用它,我应该在哪里使用它代码!所以,您也可以在答案中加入它!
为了清楚起见,我保持变量'count'告诉我问题出在哪里,我在将配方附加到文本文件之前打印它,(之后如何,多次迭代会发生这个问题)!我附加在文件中,即使出现这样的问题,至少我已经下载了一些食谱并将其保存在我的硬件中 -
感谢你提前一段时间
答案 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,除非您希望返回多个标签,就像它是作者列表一样。它还可能会减少您的一些处理时间,就像将所有提取功能合二为一。否则,你告诉解析器为每个信息提出请求。只需提出一个请求并提取所有内容。此外,通常最好设置user-agent标头。我经常将此视为请求错误的最常见原因。