所以我有一个包含60k个URL的数据帧,我正在使用beautifulsoup从这些URL中抓取数据。我已经使用 tqdm 和多处理来提高抓取速度,但有些 url 给了我一个连接错误,这很好。我想知道如何忽略此类链接并在不中断我的 tqdm 进度的情况下继续下一个链接。
import tqdm
import requests
from multiprocessing import Pool
from bs4 import BeautifulSoup
pool= Pool(10)
list_data= list(tqdm.tqdm(pool.imap(scrape_data_function, df['url'].to_list()), total= len(df['url'])))
pool.terminate()
pool.close()
我尝试使用 try 和 except,但每次出现错误的 url 时,try 块都会再次运行,并且抓取从 tqdm 上的第一个链接重新开始。
这是我的抓取功能:
def scrape_data_function(url):
page= requests.get(url, headers = headers, timeout= 5)
soup= BeautifulSoup(page.content, "html.parser")
data= soup.find_all("div", {"class": 'post-body'})
heading= soup.find("h1").getText()
count= 1
try:
dict_row= {"url": url, "data": heading + str([i.get_text(separator= " ") for i in data])}
return dict_row
except:
print(url)
蒂亚。
这个怎么样?现在,无论哪种方式,该函数都将返回相同的字典,但数据字段将是一个字符串,用于捕获引发的异常。您可以为"error":True/False 添加一个键/值对并保存该键/值对,以便您可以在生成的数据框中按错误或不错误进行筛选。
def scrape_data_function(url):
try:
page= requests.get(url, headers = headers, timeout= 5)
soup= BeautifulSoup(page.content, "html.parser")
data= soup.find_all("div", {"class": 'post-body'})
heading= soup.find("h1").getText()
count= 1
dict_row= {"url": url, "data": heading + str([i.get_text(separator= " ") for i in data])}
return dict_row
except Exception as e:
s = str(e)
dict_row= {"url": url, "data": s }
return dict_row