python 队列生产者消费者爬虫

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

循序渐进Docker Compose

文章目录 1.概述1.1 Docker Compose 定义1.2 Docker Compose背景1.3 Docker Compose核心概念 2.安装2.1 Official Repos2.2 Manual Installation2.3 v1.x 兼容性 3. YAML 配置说明3.1 Services3.2 Volumes & Networks 4. 解析 Service4.1 Pulling一个Image4.2 Building一个…

Unknown module(s) in QT: texttospeech

目录 Qt TextToSpeech Engines tts测试代码: pro配置: 报错:connection to speech-dispatcher failed 不支持中文播报 1. 安装 espeak-ng 和中文语音库 2. 配置 Speech Dispatcher 使用 espeak-ng 3. 配置 espeak-ng 支持中文 4. 重…

Java基础:面向对象(二)

Java基础:面向对象(二) 文章目录 Java基础:面向对象(二)1. 面向对象编程思想2. 类与对象2.1 类2.1.1 类的定义2.1.2 成员变量2.1.3 局部变量 2.2 对象2.2.1 对象的定义2.2.2 对象的使用2.2.3 对象创建的原理…

DataGrip使用ssh连接数据库的操作流程

1 选择数据源种类 2 配置ssh 3 填写host、port和认证方式 我选择的密码方式,也可选择其他方式连接: 本文由博客一文多发平台 OpenWrite 发布!

【放球问题】920. 播放列表的数量

本文涉及知识点 【组合数学 隔板法 容斥原理】放球问题 本题同解 【动态规划】【组合数学】【C算法】920播放列表的数量 LeetCode 920. 播放列表的数量 你的音乐播放器里有 n 首不同的歌,在旅途中,你计划听 goal 首歌(不一定不同&#x…

Selenium 模拟操作与 pytest 断言的结合使用

Selenium 模拟操作与 pytest 断言的结合使用 在使用 Selenium 进行 UI 自动化测试时,通常会结合 pytest 作为测试框架来编写和执行测试用例。pytest 提供了丰富的断言功能,可以用来验证 Selenium 模拟操作的结果是否符合预期。 断言的基本用法 在 pyt…

释放 OSINT 的力量:在线调查综合指南

开源情报 (OSINT) 是从公开信息中提取有价值见解的艺术。无论您是网络安全专业人士、道德黑客还是情报分析师,OSINT 都能为您提供先进的技术,帮助您筛选海量的数字数据,发现隐藏的真相。 在本文中,我们将深入研究大量的OSINT 资源…

冯喜运:5.29市场避险情绪升温,黄金原油小幅收涨

【黄金消息面分析】:周二(5月28日)美盘时段,由于美元走弱且市场情绪出现负面变化,黄金收复早前跌幅,站上2350美元关口。金价早盘一度走弱,源于美联储降息可能性降低带来压力,投资者在…

Spring (24)Spring中的ORM支持

在Spring框架中,ORM(Object-Relational Mapping,对象关系映射)支持是实现数据访问层的关键特性之一。Spring提供了与多个ORM框架的集成支持,包括Hibernate, JPA, JDO以及MyBatis等。Spring的ORM支持主要通过以下几方面…

AWS联网和内容分发之Transit Gateway

将Amazon VPC、AWS账户和本地网络连接到一个网关中。AWS Transit Gateway通过中央枢纽连接Amazon虚拟私有云(VPC)和本地网络。此连接简化了您的网络,并且结束了复杂的对等关系。Transit Gateway充当高度可扩展的云路由器,每个新的…

李廉洋:5.29黄金早盘2365-2345区间,今日行情走势分析及策略。

黄金消息面分析:当前美国存在一个令人担忧且未被充分关注的问题:房地产行业低迷、高利率和抵押贷款利率、租金高涨以及美联储的紧缩政策构成了一个恶性循环。由于高房价和高抵押贷款利率,美国住房经济活动远低于两年前的水平。为了让该行业好…

基于 RNNs 对 IMDB 电影评论进行情感分类

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…

java-数字加密解密

在Java中进行数字加密和解密是一个重要的安全问题,尤其是在处理敏感数据时。加密和解密技术可以帮助保护数据的安全性,防止未授权的访问和篡改。在本指南中,我们将介绍一些常用的数字加密和解密技术,以及如何在Java中实现它们。 #…

Spring控制重复请求

通过AOP拦截所有请求&#xff0c;控制在规定时间内请求次数。 1&#xff1a;添加maven <dependency><groupId>net.jodah</groupId><artifactId>expiringmap</artifactId><version>0.5.10</version> </dependency> 2&#x…

YiShaAdmin:一款基于.NET Core Web + Bootstrap的企业级快速开发框架

前言 今天大姚给大家分享一款基于.NET Core Web Bootstrap的企业级快速后台开发框架、权限管理系统&#xff0c;代码简单易懂、界面简洁美观&#xff08;基于MIT License开源&#xff0c;免费可商用&#xff09;&#xff1a;YiShaAdmin。 项目官方介绍 YiShaAdmin 基于.NET…

区间相交-435. 无重叠区间,56. 合并区间

题目连接及描述 435. 无重叠区间 - 力扣&#xff08;LeetCode&#xff09; 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目分析 二维数组&#xff0c;数组中每个元素为大小为2的一维数组&#xff0c;求移除区间的最小数量&#xff0c;使剩余区间互不重叠。今天写…

Android Intent 使用及其详解

Intent这东西&#xff0c;在Android中的地位至关重要&#xff0c;甚至成为"Android第五大组件"。 在我们的常规业务开发中&#xff0c;各个页面的跳转&#xff0c;service的使用&#xff0c;打开相机&#xff0c;app内分享&#xff0c;广播的使用等等都必须用到它。…

数据结构之堆(优先级队列)

前言 在上一章我们讲了二叉树&#xff0c;这一节我们来讲堆&#xff08;优先级队列&#xff09;&#xff0c;所以想知道堆创建&#xff0c;可以看一下二叉树的一些简单概念。http://t.csdnimg.cn/4jUR6http://t.csdnimg.cn/4jUR6 目录 前言 堆 1.概念 2.优先级队列的模拟实…

Jetson Nano重装支持cuda和aruco库的opencv-4.1.1和opencv_contrib-4.1.1【2024亲测可用】

前言 在宇树四足机器狗开发过程中&#xff0c;可能会碰到无法调用aruco库实现二维码检测&#xff0c;这是因为没有安装opencv_contrib库&#xff0c;安装opencv_contrib库需要卸载现有的opencv&#xff0c;然后重新安装&#xff0c;本文就是记录这个过程&#xff0c;亲测有效。…

1.2数学基础

向量运算 矩阵运算 比较基础就不记录了 MVP矩阵推导 1.讲为什么要有矩阵变换和不同的坐标空间 将3D物体转化到2D平面为各个空间的运用做准备 2.介绍各个空间的概念和含义 MVP矩阵代表什么&#xff1f; MVP矩阵分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。…