温馨提示×

多线程python爬虫怎样进行任务超时控制

小樊
81
2024-12-12 03:34:43
栏目: 编程语言

在Python中,可以使用concurrent.futures模块中的ThreadPoolExecutorProcessPoolExecutor来实现多线程爬虫。为了进行任务超时控制,可以使用concurrent.futures.TimeoutError异常来捕获超时的任务。

以下是一个使用ThreadPoolExecutor实现多线程爬虫并进行任务超时控制的示例:

import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor, TimeoutError

def fetch(url, timeout):
    try:
        response = requests.get(url, timeout=timeout)
        response.raise_for_status()
        return response.text
    except requests.exceptions.Timeout:
        print(f"请求超时: {url}")
        return None
    except requests.exceptions.RequestException as e:
        print(f"请求异常: {url}, 错误信息: {e}")
        return None

def parse(html):
    soup = BeautifulSoup(html, "html.parser")
    # 在这里解析网页内容,提取所需数据
    pass

def main():
    urls = [
        "https://example.com/page1",
        "https://example.com/page2",
        # 更多URL...
    ]

    timeout = 5  # 设置超时时间(秒)
    max_workers = 5  # 设置最大工作线程数

    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        futures = [executor.submit(fetch, url, timeout) for url in urls]

        for future in concurrent.futures.as_completed(futures):
            html = future.result()
            if html:
                parse(html)

if __name__ == "__main__":
    main()

在这个示例中,我们使用ThreadPoolExecutor来创建一个线程池,并使用submit方法提交任务。fetch函数用于发送HTTP请求并获取网页内容,同时设置了超时时间。如果任务超时,fetch函数会捕获requests.exceptions.Timeout异常并返回None

main函数中,我们使用as_completed方法遍历已完成的任务,并将结果传递给parse函数进行解析。这样,我们可以确保在任务超时时能够得到处理,避免程序崩溃。

0