python - 抓取时忽略 ConnectionError
问题描述
所以我有一个包含 60k url 的 DataFrame,我正在使用 beautifulsoup 从每个 url 中抓取数据。我已经使用 tqdm 和 multiprocessing 来提高抓取速度,但是一些 url 给了我一个 ConnectionError,这很好。我想知道如何忽略这些链接并继续下一个链接,而不会破坏我的 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)
TIA。
解决方案
这个怎么样?现在该函数将以任何一种方式返回相同的字典,但数据字段将是一个字符串,用于捕获引发的异常。您可以为 "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
推荐阅读
- python - 无法连接到测试服务器。“ERR_CONNECTION_REFUSED”
- airflow - 为 MLEngine 气流算子提供参数
- spring-security - 在 Spring Weblux 中为给定路径禁用身份验证和 csrf?
- python - 将数据集分组为所选变量差异最小的两组
- xcode - 你怎么知道一个复选框被选中来执行一个功能
- swift - 如何进行 CoreData 排序
- javascript - Javascript仅在复选框有值时显示?
- python - 名称 '_C' 未定义 pytorch+jupyter notebook
- racket - 更改球拍中大爆炸的按键轮询率/滴答率
- python - 缓冲区溢出 - 插入了意外值