在Python中,可以使用threading
库来实现多线程爬虫。以下是一个简单的多线程爬虫示例:
pip install requests beautifulsoup4
worker.py
的文件,其中包含以下内容:import threading
import requests
from bs4 import BeautifulSoup
class WebCrawler(threading.Thread):
def __init__(self, url, results):
threading.Thread.__init__(self)
self.url = url
self.results = results
def run(self):
try:
response = requests.get(self.url)
response.raise_for_status()
soup = BeautifulSoup(response.text, 'html.parser')
# 提取页面中的链接,这里仅作为示例,可以根据需要修改
links = [a['href'] for a in soup.find_all('a', href=True)]
self.results.extend(links)
except Exception as e:
print(f"Error while processing {self.url}: {e}")
def main():
start_url = "https://example.com"
num_threads = 10
max_pages_per_thread = 5
results = []
threads = []
for _ in range(num_threads):
for _ in range(max_pages_per_thread):
url = f"{start_url}?page={_+1}"
thread = WebCrawler(url, results)
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
threads.remove(thread)
print("All done!")
print("Results:")
print(results)
if __name__ == "__main__":
main()
在这个示例中,我们创建了一个名为WebCrawler
的线程类,它继承自threading.Thread
。我们在run
方法中实现了爬虫的逻辑,包括发送HTTP请求、解析HTML内容以及提取页面中的链接。
在main
函数中,我们创建了多个线程,并为每个线程分配了一定数量的URL。然后,我们启动所有线程并等待它们完成。最后,我们打印出所有结果。
请注意,这个示例仅用于演示目的,实际应用中可能需要根据需求进行更多的错误处理和优化。此外,如果需要处理大量页面和链接,可以考虑使用异步编程(如asyncio
库)来提高性能。