• python 队列生产者消费者爬虫


    当使用Python编写一个基于队列的生产者消费者爬虫时,我们通常会使用threadingmultiprocessing模块来处理并发,并使用queue模块来管理数据队列。下面是一个详细的示例,该示例展示了如何使用生产者线程生成URL,消费者线程爬取这些URL的内容。

    请注意,这里为了简化示例,我们将不会实际进行网页爬取,而是模拟这个过程。在实际应用中,我们可能需要使用如requests库来发送HTTP请求,并使用如BeautifulSouplxml来解析HTML内容。

    (1)安装必要的库(如果尚未安装)

    1. bash复制代码
    2. pip install requests beautifulsoup4

    (2)示例代码

    1. import threading  
    2. import queue  
    3. import time  
    4. import random  
    5. from urllib.parse import urljoin  
    6. from bs4 import BeautifulSoup  # 导入BeautifulSoup,但在此示例中不会实际使用  
    7. import requests  # 导入requests,但在此示例中不会实际发送请求  
    8.  
    9. # 模拟的起始URL和要爬取的网站域名  
    10. START_URL = 'http://example.com'  
    11. BASE_DOMAIN = 'http://example.com'  
    12.  
    13. # 队列,用于在生产者和消费者之间传递URL  
    14. url_queue = queue.Queue()  
    15.  
    16. # 生产者函数,生成并添加URL到队列中  
    17. def producer(url_queue, num_urls):  
    18.    print('Producer started.')  
    19.    urls_seen = set()  
    20.    urls_to_add = [START_URL]  
    21.      
    22.    while urls_to_add and num_urls > 0:  
    23.        current_url = urls_to_add.pop(0)  
    24.        if current_url not in urls_seen:  
    25.            urls_seen.add(current_url)  
    26.            url_queue.put(current_url)  
    27.            num_urls -= 1  
    28.              
    29.            # 模拟从当前URL生成新的URL(这里只是简单地添加了一些随机路径)  
    30.            for _ in range(random.randint(1, 3)):  
    31.                new_path = f"/some/random/path/{random.randint(1, 100)}"  
    32.                new_url = urljoin(BASE_DOMAIN, new_path)  
    33.                urls_to_add.append(new_url)  
    34.      
    35.    print('Producer finished generating', num_urls, 'URLs.')  
    36.  
    37. # 消费者函数,从队列中获取URL并“爬取”内容(模拟)  
    38. def consumer(url_queue):  
    39.    print('Consumer started.')  
    40.    while not url_queue.empty():  
    41.        url = url_queue.get()  
    42.        print(f'Crawling {url}...')  
    43.          
    44.        # 在这里,我们会使用requests发送HTTP请求,并使用BeautifulSoup解析内容  
    45.        # 但为了简化示例,我们只是模拟这个过程  
    46.        time.sleep(random.uniform(0.5, 1.5))  # 模拟网络延迟  
    47.        print(f'Crawled {url}. Content: (Simulated content)')  
    48.          
    49.        # 标记URL为已处理(在实际应用中可能不需要)  
    50.        url_queue.task_done()  
    51.      
    52.    print('Consumer finished.')  
    53.  
    54. # 创建并启动生产者线程  
    55. producer_thread = threading.Thread(target=producer, args=(url_queue, 10))  # 生成10个URL作为示例  
    56. producer_thread.start()  
    57.  
    58. # 创建并启动多个消费者线程  
    59. num_consumers = 3  
    60. consumer_threads = []  
    61. for _ in range(num_consumers):  
    62.    consumer_thread = threading.Thread(target=consumer, args=(url_queue,))  
    63.    consumer_thread.start()  
    64.    consumer_threads.append(consumer_thread)  
    65.  
    66. # 等待所有消费者线程完成  
    67. for t in consumer_threads:  
    68.    t.join()  
    69.  
    70. # 等待生产者线程完成(如果需要的话)  
    71. producer_thread.join()  
    72.  
    73. # 当队列为空时,所有任务都已完成  
    74. print('All tasks completed.')

    这个示例展示了如何使用线程和队列来实现生产者消费者模式。生产者线程生成URL并将其添加到队列中,而消费者线程从队列中获取URL并模拟爬取过程。请注意,由于线程共享内存,因此我们需要小心处理对队列的访问,但Python的queue模块是线程安全的,因此我们可以安全地在多个线程之间传递数据。

  • 相关阅读:
    excel公式怎么完全复制到另一列?
    客户端和服务器之间的通信
    2022届软件部讲课底稿------分组背包问题
    基于JAVA校园二手交易平台计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    【linux】基础IO+系统文件IO+文件描述符分配规则
    (附源码)SSM宠物领养系统 毕业设计 031654
    iOS 关于 UICollectionView常见使用方法
    等精度频率计的设计与验证
    MS4553S双向电平转换器可pin对pin兼容TXB0102/TXS0102
    探索Django:从项目创建到图片上传的全方位指南
  • 原文地址:https://blog.csdn.net/m0_72958694/article/details/139275603