python 队列生产者消费者爬虫

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

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

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

bash 复制代码
bash复制代码
​
pip install requests beautifulsoup4

(2)示例代码

python 复制代码
import threading  
import queue  
import time  
import random  
from urllib.parse import urljoin  
from bs4 import BeautifulSoup  # 导入BeautifulSoup,但在此示例中不会实际使用  
import requests  # 导入requests,但在此示例中不会实际发送请求  
  
# 模拟的起始URL和要爬取的网站域名  
START_URL = 'http://example.com'  
BASE_DOMAIN = 'http://example.com'  
  
# 队列,用于在生产者和消费者之间传递URL  
url_queue = queue.Queue()  
  
# 生产者函数,生成并添加URL到队列中  
def producer(url_queue, num_urls):  
    print('Producer started.')  
    urls_seen = set()  
    urls_to_add = [START_URL]  
      
    while urls_to_add and num_urls > 0:  
        current_url = urls_to_add.pop(0)  
        if current_url not in urls_seen:  
            urls_seen.add(current_url)  
            url_queue.put(current_url)  
            num_urls -= 1  
              
            # 模拟从当前URL生成新的URL(这里只是简单地添加了一些随机路径)  
            for _ in range(random.randint(1, 3)):  
                new_path = f"/some/random/path/{random.randint(1, 100)}"  
                new_url = urljoin(BASE_DOMAIN, new_path)  
                urls_to_add.append(new_url)  
      
    print('Producer finished generating', num_urls, 'URLs.')  
  
# 消费者函数,从队列中获取URL并"爬取"内容(模拟)  
def consumer(url_queue):  
    print('Consumer started.')  
    while not url_queue.empty():  
        url = url_queue.get()  
        print(f'Crawling {url}...')  
          
        # 在这里,我们会使用requests发送HTTP请求,并使用BeautifulSoup解析内容  
        # 但为了简化示例,我们只是模拟这个过程  
        time.sleep(random.uniform(0.5, 1.5))  # 模拟网络延迟  
        print(f'Crawled {url}. Content: (Simulated content)')  
          
        # 标记URL为已处理(在实际应用中可能不需要)  
        url_queue.task_done()  
      
    print('Consumer finished.')  
  
# 创建并启动生产者线程  
producer_thread = threading.Thread(target=producer, args=(url_queue, 10))  # 生成10个URL作为示例  
producer_thread.start()  
  
# 创建并启动多个消费者线程  
num_consumers = 3  
consumer_threads = []  
for _ in range(num_consumers):  
    consumer_thread = threading.Thread(target=consumer, args=(url_queue,))  
    consumer_thread.start()  
    consumer_threads.append(consumer_thread)  
  
# 等待所有消费者线程完成  
for t in consumer_threads:  
    t.join()  
  
# 等待生产者线程完成(如果需要的话)  
producer_thread.join()  
  
# 当队列为空时,所有任务都已完成  
print('All tasks completed.')

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

相关推荐
蒙娜丽宁9 分钟前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev11 分钟前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
王俊山IT11 分钟前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
为将者,自当识天晓地。13 分钟前
c++多线程
java·开发语言
小政爱学习!15 分钟前
封装axios、环境变量、api解耦、解决跨域、全局组件注入
开发语言·前端·javascript
好喜欢吃红柚子25 分钟前
万字长文解读空间、通道注意力机制机制和超详细代码逐行分析(SE,CBAM,SGE,CA,ECA,TA)
人工智能·pytorch·python·计算机视觉·cnn
小馒头学python29 分钟前
机器学习是什么?AIGC又是什么?机器学习与AIGC未来科技的双引擎
人工智能·python·机器学习
k093331 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
神奇夜光杯38 分钟前
Python酷库之旅-第三方库Pandas(202)
开发语言·人工智能·python·excel·pandas·标准库及第三方库·学习与成长
Themberfue41 分钟前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·