欢迎访问宙启技术站
智能推送

Python中使用Process()类实现多进程爬虫的示例

发布时间:2023-12-17 22:41:23

在Python中,可以使用multiprocessing模块中的Process类来实现多进程爬虫。Process类可以创建一个子进程,在子进程中执行指定的函数。以下是一个使用Process类实现多进程爬虫的示例代码:

import requests
import multiprocessing

def download_page(url):
    response = requests.get(url)
    if response.status_code == 200:
        return response.text

def crawl(urls):
    results = []
    processes = []

    # 创建进程池
    pool = multiprocessing.Pool()

    for url in urls:
        # 在进程池中异步执行下载页面的函数
        process = pool.apply_async(download_page, args=(url,))
        processes.append(process)

    # 等待所有进程执行完毕
    pool.close()
    pool.join()

    # 获取每个进程的执行结果
    for process in processes:
        result = process.get()
        results.append(result)

    return results

if __name__ == '__main__':
    urls = ['http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3']
    pages = crawl(urls)
    for page in pages:
        print(page)

在上述代码中,我们定义了两个函数:download_page()用于下载指定URL的页面内容,crawl()用于实现爬虫逻辑。crawl()函数接收一个URL列表作为参数,创建多个子进程,在每个子进程中调用download_page()函数来下载页面内容,并将结果存储在一个列表中。最后,返回这个列表。

crawl()函数中,我们首先创建一个进程池 pool,然后使用pool.apply_async()方法来异步执行download_page()函数。apply_async()方法相当于创建了一个子进程,将任务交给这个子进程来执行。

接下来,我们遍历URL列表,将每个URL传递给apply_async()方法,并将返回的进程对象存储在processes列表中。

在所有URL都被处理完后,我们调用pool.close()方法来关闭进程池,表示不再向进程池中添加新的任务。然后调用pool.join()方法,等待所有子进程执行完毕。

最后,我们遍历processes列表,依次调用process.get()方法获取每个进程的执行结果,并将结果存储在results列表中。最终,返回results列表。

if __name__ == '__main__':部分,我们定义了一个URL列表,并调用crawl()函数来进行爬虫操作。最后,遍历获得的页面内容,并打印出来。

通过使用Process类,我们可以简单地实现多进程爬虫,提升爬虫效率。每个进程之间独立执行,并且使用了进程池来管理进程的创建和销毁,降低了进程创建和销毁的开销,从而提高了多进程爬虫的性能。