编写多线程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
函数。最后,我们等待所有线程完成,并输出抓取的链接。
请注意,这个示例仅用于演示目的。在实际应用中,你可能需要根据目标网站的结构和爬虫需求进行调整。同时,请确保遵守目标网站的爬虫政策,以免违反法律法规。