python

多线程python爬虫代码如何编写

小樊
81
2024-12-12 05:56:46
栏目: 编程语言

编写多线程Python爬虫代码需要使用Python的threading模块。以下是一个简单的多线程爬虫示例,它从一个网站抓取所有链接。

首先,确保已经安装了requestsbeautifulsoup4库。如果没有安装,可以使用以下命令安装:

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函数。最后,我们等待所有线程完成,并输出抓取的链接。

请注意,这个示例仅用于演示目的。在实际应用中,你可能需要根据目标网站的结构和爬虫需求进行调整。同时,请确保遵守目标网站的爬虫政策,以免违反法律法规。

0
看了该问题的人还看了