在Python中,可以使用concurrent.futures
模块中的ThreadPoolExecutor
或ProcessPoolExecutor
来实现多线程爬虫。为了进行任务超时控制,可以使用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
函数进行解析。这样,我们可以确保在任务超时时能够得到处理,避免程序崩溃。