首页 > 编程语言 >python 队列生产者消费者爬虫

python 队列生产者消费者爬虫

时间:2024-05-28 19:34:20浏览次数:28  
标签:示例 python URL 爬虫 queue 队列 线程 url urls

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

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

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

bash复制代码

pip install requests beautifulsoup4

(2)示例代码

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模块是线程安全的,因此我们可以安全地在多个线程之间传递数据。

标签:示例,python,URL,爬虫,queue,队列,线程,url,urls
From: https://www.cnblogs.com/TS86/p/18218681

相关文章

  • XV-Python-requests_html
    目录        1.requests_html        1.1.什么是requests_html        1.2.安装与配置        1.3.快速入门        1.4.图片下载        2.思维导图1.requests_html1.1.什么是requests_htmlrequests_html是一个P......
  • 用python字典统计CSV数据
    1.用python字典统计CSV数据的步骤和代码示例为了使用Python字典来统计CSV数据,我们可以使用内置的csv模块来读取CSV文件,并使用字典来存储统计信息。以下是一个详细的步骤和完整的代码示例:1.1步骤(1)导入csv模块。(2)打开CSV文件并读取数据。(3)初始化一个空字典来存储统计信息。(4)遍......
  • Python|module 的 __spec__ 属性
    Python的module(模块)**【官方文档】**位置:https://docs.python.org/zh-cn/3/library/stdtypes.html#modules模块唯一的特殊操作是属性访问:m.name,这里m为一个模块而name访问定义在m的符号表中的一个名称。模块属性可以被赋值。(请注意import语句严格来说也是......
  • 使用Python进行数据分析与可视化的简单示例
    使用Python进行数据分析与可视化的简单示例。在这个示例中,我们将使用Pandas库进行数据分析,并使用Matplotlib库进行数据可视化。首先,假设我们有一个包含销售数据的CSV文件(sales_data.csv),其中包含以下列:日期(Date)、销售额(Sales)和产品类别(Product_Category)。CSV文件的内容可能......
  • Python基础篇(集成开发环境 PyCharm )
    PyCharm简介与下载PyCharm是由JetBrains打造的一款PythonIDE,是一款功能强大的Python编辑器,具有跨平台性,支持macOS、Windows、Linux系统。PyCharm具有:调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制等优点。PyCharm下载地址:......
  • Python 文件操作指南:使用 open 和 with open 实现高效读写
    ......
  • 流畅的python--第五章/第六章
    数据类构建器一个简单的类,表示地理位置的经纬度。使用nametuple构建Coordinate类。namedtuple是一个工厂方法,使用指定的名称和字段构建tuple的子类。典型的具名元组collections.namedtuple是一个工厂函数,用于构建增强的tuple子类,具有字段名称、类名和提供有用的信息的__repr_......
  • 基于Python实现可视化分析中国500强排行榜数据的设计与实现
    基于Python实现可视化分析中国500强排行榜数据的设计与实现“DesignandImplementationofVisualAnalysisforChina’sTop500CompaniesRankingDatausingPython”完整下载链接:基于Python实现可视化分析中国500强排行榜数据的设计与实现文章目录基于Python......
  • Python魔法之旅-魔法方法(01)
    目录一、概述1、定义2、作用二、主要应用场景1、构造和析构2、操作符重载3、字符串和表示4、容器管理5、可调用对象6、上下文管理7、属性访问和描述符8、迭代器和生成器9、数值类型10、复制和序列化11、自定义元类行为12、自定义类行为13、类型检查和转换14......
  • 进程间通信(队列和生产消费模型)
    【一】引入【1】什么是进程间通信进程间通信(Inter-ProcessCommunication,IPC)是指两个或多个进程之间进行信息交换的过程【2】如何实现进程间通信借助于消息队列,进程可以将消息放入队列中,然后由另一个进程从队列中取出这种通信方式是非阻塞的,即发送进程不需要等待接收进......