Python爬虫

Python爬虫 知识量:11 - 28 - 71

6.3 多进程爬虫><

使用multiprocessing的多进程爬虫- 6.3.1 -

使用Python的multiprocessing模块可以实现多进程爬虫。多进程允许在多个进程中同时执行代码,每个进程有自己的内存空间和执行环境,可以充分利用多核CPU的性能。下面是一个使用multiprocessing模块的示例:

import multiprocessing  
import requests  
from bs4 import BeautifulSoup  
  
# 定义一个爬虫函数  
def crawl_website(url):  
    try:  
        response = requests.get(url)  
        response.raise_for_status()  # 确保请求成功  
        return response.text  
    except requests.RequestException as e:  
        print(f"请求出错: {e}")  
        return None  
  
# 定义一个解析函数  
def parse_html(html):  
    soup = BeautifulSoup(html, 'html.parser')  
    # 在这里编写解析HTML的逻辑,提取所需的数据  
    # 例如,提取所有的链接  
    links = soup.find_all('a')  
    for link in links:  
        print(link.get('href'))  # 打印链接  
  
if __name__ == '__main__':  
    start_url = 'http://example.com'  # 替换为要爬取的网站地址  
    pool = multiprocessing.Pool()  # 创建一个进程池  
    results = pool.map(crawl_website, [start_url])  # 将爬取任务提交给进程池并等待结果  
    # 这里需要对结果进行处理,比如解析HTML并提取所需数据  
    for result in results:  
        if result:  
            parse_html(result)  
    pool.close()  # 关闭进程池  
    pool.join()  # 等待所有进程完成  
    print("所有进程已完成")

在上面的示例中,使用multiprocessing.Pool()创建了一个进程池pool。然后,将爬取任务crawl_website提交给进程池,并使用pool.map()等待结果。每个进程会独立执行爬取任务,并将结果返回给主进程。最后,对结果进行处理,比如解析HTML并提取所需数据。需要注意的是,在所有进程完成后,需要调用pool.close()关闭进程池,并调用pool.join()等待所有进程完成。

使用Pool+Queue的多进程爬虫- 6.3.2 -

要使用multiprocessing.Pool和queue模块实现多进程爬虫,可以结合使用Queue来管理任务分配和数据传递。下面是一个示例:

import multiprocessing  
import requests  
from bs4 import BeautifulSoup  
import queue  
  
# 定义一个爬虫函数  
def crawl_website(q, url):  
    while not q.empty():  # 从队列中获取任务  
        next_url = q.get()  
        try:  
            response = requests.get(next_url)  
            response.raise_for_status()  # 确保请求成功  
            parse_html(response.text)  # 解析HTML并提取所需数据  
        except requests.RequestException as e:  
            print(f"请求出错: {e}")  
  
# 定义一个解析函数  
def parse_html(html):  
    soup = BeautifulSoup(html, 'html.parser')  
    # 在这里编写解析HTML的逻辑,提取所需的数据  
    # 例如,提取所有的链接  
    links = soup.find_all('a')  
    for link in links:  
        print(link.get('href'))  # 打印链接  
  
if __name__ == '__main__':  
    start_url = 'http://example.com'  # 替换为要爬取的网站地址  
    q = multiprocessing.Queue()  # 创建一个队列对象  
    pool = multiprocessing.Pool()  # 创建一个进程池  
    # 将起始URL放入队列中  
    q.put(start_url)  
    # 将队列对象传递给进程池中的进程  
    results = pool.map(crawl_website, [(q, start_url)])  
    pool.close()  # 关闭进程池  
    pool.join()  # 等待所有进程完成  
    print("所有进程已完成")

在上面的示例中,首先创建了一个multiprocessing.Queue()对象q来管理任务和数据。然后,使用multiprocessing.Pool()创建了一个进程池pool。将起始URL放入队列中,并将其作为参数传递给进程池中的进程。在每个进程中,使用q.get()从队列中获取任务,并执行相应的爬取操作。最后,等待所有进程完成,并打印出"所有进程已完成"。