在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
庫)來提高性能。