首页 > 解决方案 > 抓取时忽略 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。

标签: pythonpandasbeautifulsoupmultiprocessingtqdm

解决方案


这个怎么样?现在该函数将以任何一种方式返回相同的字典,但数据字段将是一个字符串,用于捕获引发的异常。您可以为 "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

推荐阅读