编写多线程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 = https://www.yisu.com/ask/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。然后,它查找所有的标签,提取
href
属性的值,并将其添加到链接列表中。为了确保线程安全,我们使用了线程锁来同步对链接列表的访问。
在main
函数中,我们创建了5个线程,每个线程都会调用fetch
函数。最后,我们等待所有线程完成,并输出抓取的链接。
请注意,这个示例仅用于演示目的。在实际应用中,你可能需要根据目标网站的结构和爬虫需求进行调整。同时,请确保遵守目标网站的爬虫政策,以免违反法律法规。