在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
函数进行解析。这样,我们可以确保在任务超时时能够得到处理,避免程序崩溃。