asyncio+queue实现生产者消费者爬虫模型
在网络爬虫开发中生产者 - 消费者模型是经典且高效的架构模式。它将 “任务生产URL 采集” 和 “任务消费页面爬取” 解耦能有效控制并发、避免资源浪费。而 Python 的asyncio异步 I/O结合asyncio.Queue可以打造出高性能的异步爬虫相比传统多线程 / 多进程爬虫异步模型在 IO 密集型的爬虫场景下效率提升显著。一、核心原理1. 生产者 - 消费者模型生产者负责生成待爬取的 URL将其放入队列中是爬虫的 “任务源”消费者从队列中取出 URL执行页面请求、数据解析等操作是爬虫的 “执行端”队列asyncio.Queue作为生产者和消费者之间的缓冲解耦两者的执行节奏控制并发数量避免瞬间请求量过大导致的被封 IP 或服务器压力过高。2. asyncio 的优势asyncio是 Python 内置的异步编程框架基于事件循环实现无需创建大量线程 / 进程仅通过单线程的协程切换就能处理大量 IO 操作如网络请求资源开销远低于多线程适合爬虫这类高 IO 场景。二、完整实现代码以下是一个可直接运行的异步爬虫示例以爬取某测试站点的页面标题为例完整实现生产者 - 消费者模型python运行import asyncio import aiohttp from aiohttp import ClientTimeout from typing import List # 全局配置 MAX_CONCURRENT 5 # 最大并发消费者数量 QUEUE_MAXSIZE 10 # 队列最大容量控制缓冲大小 BASE_URL https://httpbin.org/get?page{} # 测试URL PAGE_RANGE range(1, 21) # 待爬取的页面范围1-20页 class AsyncCrawler: def __init__(self): # 初始化异步队列设置最大容量 self.queue asyncio.Queue(maxsizeQUEUE_MAXSIZE) # 存储爬取结果 self.results [] async def producer(self, urls: List[str]): 生产者将待爬取的URL放入队列 for url in urls: await self.queue.put(url) print(f生产者已放入URL - {url}) # 放入结束标记数量等于消费者数量通知消费者退出 for _ in range(MAX_CONCURRENT): await self.queue.put(None) async def consumer(self, session: aiohttp.ClientSession, consumer_id: int): 消费者从队列取出URL并爬取 while True: # 从队列获取URL异步阻塞直到有数据 url await self.queue.get() # 检测结束标记 if url is None: print(f消费者{consumer_id}收到结束标记退出) self.queue.task_done() break try: # 异步请求页面 async with session.get(url, timeoutClientTimeout(total10)) as response: if response.status 200: # 解析响应数据此处仅示例可替换为实际解析逻辑 data await response.json() page data[args][page] self.results.append(f页面{page}爬取成功) print(f消费者{consumer_id}成功爬取 - {url}) else: print(f消费者{consumer_id}爬取失败状态码 - {response.status}) except Exception as e: print(f消费者{consumer_id}爬取异常 - {url}错误{str(e)}) finally: # 标记任务完成用于队列的join()方法 self.queue.task_done() async def run(self): 启动爬虫主流程 # 1. 生成待爬取的URL列表 urls [BASE_URL.format(page) for page in PAGE_RANGE] # 2. 创建异步HTTP会话复用连接提升性能 async with aiohttp.ClientSession() as session: # 3. 创建并启动生产者任务 producer_task asyncio.create_task(self.producer(urls)) # 4. 创建并启动多个消费者任务 consumer_tasks [] for i in range(MAX_CONCURRENT): task asyncio.create_task(self.consumer(session, i1)) consumer_tasks.append(task) # 5. 等待生产者任务完成 await producer_task # 6. 等待队列中所有任务处理完成 await self.queue.join() # 7. 等待所有消费者任务退出 await asyncio.gather(*consumer_tasks) # 8. 输出爬取结果 print(\n 爬取完成 ) for res in self.results: print(res) print(f总计成功爬取{len(self.results)} 条数据) if __name__ __main__: # 运行异步爬虫 crawler AsyncCrawler() asyncio.run(crawler.run())三、代码核心解析1. 队列初始化self.queue asyncio.Queue(maxsizeQUEUE_MAXSIZE)初始化异步队列maxsize限制队列最大容量避免生产者生产过快导致内存溢出。2. 生产者逻辑遍历 URL 列表通过await self.queue.put(url)将 URL 放入队列生产完成后放入与消费者数量相同的None作为结束标记确保每个消费者都能收到退出信号。3. 消费者逻辑循环从队列取 URLurl await self.queue.get()异步阻塞无数据时等待检测到None时退出循环完成消费者任务使用aiohttp.ClientSession发起异步 HTTP 请求复用连接池提升效率无论爬取成功 / 失败最终调用self.queue.task_done()标记任务完成供队列join()方法检测。4. 主流程控制asyncio.create_task()创建协程任务实现生产者和多个消费者的并发执行await self.queue.join()阻塞直到队列中所有任务都被task_done()标记确保所有 URL 都被处理asyncio.gather(*consumer_tasks)等待所有消费者任务正常退出。四、关键优化点连接复用使用aiohttp.ClientSession而非每次请求创建新会话减少 TCP 连接建立开销并发控制通过MAX_CONCURRENT限制消费者数量避免并发过高触发反爬异常处理捕获请求过程中的异常避免单个 URL 爬取失败导致消费者退出队列缓冲设置QUEUE_MAXSIZE当队列满时生产者会阻塞实现生产消费的速率匹配。五、适用场景与扩展1. 适用场景高并发爬取大量网页如电商商品页、新闻列表页需控制爬取速率避免目标网站反爬IO 密集型爬取任务大部分时间消耗在网络请求上。2. 扩展方向去重机制添加 URL 去重如使用集合避免重复爬取重试机制对失败的 URL 进行重试提升爬取成功率数据存储将爬取结果写入数据库如 MySQL、MongoDB需使用异步数据库驱动代理池集成添加异步代理池随机切换代理 IP避免被封任务持久化将队列中的 URL 持久化到文件 / 数据库实现断点续爬。总结asyncio Queue实现的生产者 - 消费者爬虫核心是通过异步队列解耦生产URL 生成和消费页面爬取利用异步 IO 提升爬取效率关键控制点包括并发数限制、队列容量限制、异常处理、结束标记传递该模型兼具高性能和可控性是异步爬虫开发的经典架构可根据实际需求扩展去重、重试、代理等功能。相比传统同步爬虫异步生产者 - 消费者模型在处理大量 IO 密集型任务时能以更低的资源开销实现更高的并发量是 Python 爬虫开发中值得掌握的核心技术。

相关新闻

httpx库异步爬虫实战对比aiohttp

httpx库异步爬虫实战对比aiohttp

在 Python 异步网络请求领域,aiohttp 曾长期占据主流地位,而 httpx 的出现凭借更简洁的 API、原生支持 HTTP/1.1 和 HTTP/2 以及与 requests 高度相似的语法,成为异步爬虫开发的新选择。本文将从实战角度出发,对比 httpx 与 aioht…

2026/7/5 10:29:10 阅读更多 →
导师推荐!专科生必用10款AI论文工具测评

导师推荐!专科生必用10款AI论文工具测评

导师推荐!专科生必用10款AI论文工具测评 2026年专科生论文写作工具测评:为何需要这份榜单? 随着AI技术在教育领域的深入应用,越来越多的专科生开始借助智能工具提升论文写作效率。然而面对市场上种类繁多的AI论文工具,…

2026/7/5 22:07:03 阅读更多 →
AI智能就业咨询服务平台系统:用技术破解求职困境

AI智能就业咨询服务平台系统:用技术破解求职困境

找工作时的“信息差”“匹配差”“准备差”,曾是求职者的三大痛点。AI智能就业咨询服务平台系统,正是靠技术搭建的“求职智囊团”,把复杂的就业服务拆成可落地的智能功能,让求职从“盲投盲试”变成“精准出击”。其核心价值&#…

2026/7/5 22:59:38 阅读更多 →

最新新闻

10m/s超高速电梯:西奥XO-NEWIII如何树立行业速度标杆

10m/s超高速电梯:西奥XO-NEWIII如何树立行业速度标杆

一、超高速电梯的技术难点 电梯速度的提升,并非简单地换装更大功率的电机。当电梯运行速度从常规的1.75m/s提升到10m/s,一系列技术难题会呈几何级数放大。 超高速电梯的核心技术难点10m/s意味着电梯每秒运行10米,相当于时速36公里。在这种速度…

2026/7/7 1:23:52 阅读更多 →
嵌入式(C语言基础)

嵌入式(C语言基础)

1.内存分为四个区域:栈区,堆区,数据区,代码区栈区:由编译器自动分配,存放局部变量堆区:程序员手动分配,手动存放数据区:存放全局变量,静态变量代码区:只读,存放程序指令2.作用域和生命周期作用域…

2026/7/7 1:21:52 阅读更多 →
抖音直播数据采集利器:5分钟掌握全量实时数据获取技巧

抖音直播数据采集利器:5分钟掌握全量实时数据获取技巧

抖音直播数据采集利器:5分钟掌握全量实时数据获取技巧 【免费下载链接】DouyinLiveWebFetcher 抖音直播间网页版的弹幕数据抓取(2025最新版本) 项目地址: https://gitcode.com/gh_mirrors/do/DouyinLiveWebFetcher 还在为无法获取抖音…

2026/7/7 1:21:51 阅读更多 →
从工程经验角度分析直流无刷电机FOC控制(七)滞环控制

从工程经验角度分析直流无刷电机FOC控制(七)滞环控制

1.FOC有几种对于电压源逆变器供电的控制系统,电流环的控制可以简单地分为静止坐标系下的电流控制以及同步旋转坐标系下的电流控制。对于旋转坐标系下的电流控制,目前常用的是滞环电流控制和PI 电流控制。很多人会误以为:FOC PI SVPWM &…

2026/7/7 1:19:51 阅读更多 →
Halcon 20.11 图像采集错误 5312 排查:3步解决相机初始化失败

Halcon 20.11 图像采集错误 5312 排查:3步解决相机初始化失败

Halcon 20.11 图像采集错误 5312 排查:3步解决相机初始化失败工业视觉系统中,Halcon与工业相机的稳定连接是确保图像采集质量的关键环节。当遇到错误代码5312("Image acquisition: device cannot be initialized")时&am…

2026/7/7 1:19:51 阅读更多 →
大厂入场知识库赛道:企业知识管理的竞争壁垒到底在哪里?

大厂入场知识库赛道:企业知识管理的竞争壁垒到底在哪里?

阿里云近日发布了Qoder企业版,配套推出了个人云端知识库QMind,主打跨场景知识共享和多数据源集成,已上架官方Skill市场。同时推出的还有Credits资源池化付费模式,支持管理员动态分配额度。这意味着又一互联网巨头正式入场企业知识…

2026/7/7 1:17:51 阅读更多 →

日新闻

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

鸿蒙新特性:图片画廊与轮播导航——构建沉浸式图片浏览体验

图片浏览是移动应用中最高频的场景之一。从社交应用的照片流到电商平台的商品图集,从旅游应用的景点相册到摄影作品展示——用户对图片浏览的体验要求不断提高:流畅的切换动画、直观的缩略图导航、便捷的收藏操作、自动播放模式。HarmonyOS NEXT ArkUI 虽…

2026/7/7 0:05:16 阅读更多 →
24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V DC-DC降压芯片PW2312B/PW2815,SOT23-6到SOP8-EP方案对比

24V稳压芯片完整选型指南 PW8600 PW75XX PW2815 PW2312B LDODC/DC全方案 一、24V稳压方案概述 24V直流电源在工业自动化、门禁系统、电梯控制、汽车电子、LED驱动、监控设备等场景中应用极广,是最常见的中压直流母线电压。要将24V母线稳定降压至下游MCU、传感器…

2026/7/7 0:05:16 阅读更多 →
RAG+知识图谱混合检索与Graph RAG核心对比

RAG+知识图谱混合检索与Graph RAG核心对比

做企业RAG落地的团队,往往容易卡在一容易踩坑的选型难题: 当需求单纯靠向量RAG搞不定、单纯靠知识图谱也搞不定,必须同时依赖「文本语义理解 实体关系推理」时,到底是做「向量图谱混合检索」就够了,还是必须上「Grap…

2026/7/7 0:07:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/6 8:11:50 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/6 8:11:52 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/6 6:52:56 阅读更多 →

月新闻