編寫多線程Python爬蟲代碼需要使用Python的threading
模塊。以下是一個簡單的多線程爬蟲示例,它從一個網站抓取所有鏈接。
首先,確保已經安裝了requests
和beautifulsoup4
庫。如果沒有安裝,可以使用以下命令安裝:
pip install requests beautifulsoup4
然后,創建一個名為multithreaded_crawler.py
的文件,并將以下代碼粘貼到文件中:
import threading
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
# 爬取的網站URL
url = 'https://example.com'
# 存儲抓取的鏈接的列表
links = []
# 線程鎖,用于同步對鏈接列表的訪問
lock = threading.Lock()
def fetch(url):
try:
response = requests.get(url)
response.raise_for_status()
except requests.RequestException as e:
print(f'Error fetching {url}: {e}')
return
soup = BeautifulSoup(response.text, 'html.parser')
for link in soup.find_all('a'):
href = link.get('href')
if href:
full_url = urljoin(url, href)
with lock:
links.append(full_url)
def main():
threads = []
# 創建線程并啟動爬蟲
for _ in range(5): # 創建5個線程
thread = threading.Thread(target=fetch, args=(url,))
thread.start()
threads.append(thread)
# 等待所有線程完成
for thread in threads:
thread.join()
# 輸出抓取的鏈接
print('Fetched links:')
for link in links:
print(link)
if __name__ == '__main__':
main()
在這個示例中,我們創建了一個名為fetch
的函數,它接受一個URL作為參數。這個函數使用requests
庫獲取網頁內容,并使用BeautifulSoup
解析HTML。然后,它查找所有的<a>
標簽,提取href
屬性的值,并將其添加到鏈接列表中。為了確保線程安全,我們使用了線程鎖來同步對鏈接列表的訪問。
在main
函數中,我們創建了5個線程,每個線程都會調用fetch
函數。最后,我們等待所有線程完成,并輸出抓取的鏈接。
請注意,這個示例僅用于演示目的。在實際應用中,你可能需要根據目標網站的結構和爬蟲需求進行調整。同時,請確保遵守目標網站的爬蟲政策,以免違反法律法規。