内存队列
约 1137 字大约 4 分钟
2025-01-11
介绍
内存模式是 HunterX
的一种队列管理方式,它将爬虫请求和任务保存在程序的内存中进行处理。在这种模式下,任务队列完全依赖于系统的内存。
特点与优势
高效性
:因为数据存储在内存中,任务的读取和写入速度非常快,适合需要高频次请求的爬虫。无外部依赖
:无需额外安装和配置消息队列系统(如 RabbitMQ 或 Redis),减少了系统的复杂性。简易性
:内存队列实现相对简单,适合小规模的爬虫任务和开发调试阶段的使用。实时性
:任务从队列中读取后立即被处理,没有网络延迟或其他外部因素的影响。
使用场景
小规模爬虫
:适用于任务量不大且能在单机内存范围内完成的爬虫应用。开发和调试
:开发过程中进行快速的功能测试和调试时,内存模式是一种简单且高效的选择。任务不需要持久化
:如果任务队列不需要持久化存储,例如仅处理当前运行中的数据,内存模式是理想的选择。
限制与挑战
内存限制
:随着任务数量的增加,内存使用量也会不断增大,可能导致内存溢出或性能下降。单机依赖
:所有的任务都存储在本机内存中,当爬虫进程终止时,所有队列数据会丢失,无法持久化。无法扩展
:内存模式只适用于单机环境,无法像 RabbitMQ 或 Redis 一样轻松地支持分布式扩展。
创建方式
你可以在创建项目时创建第一个任务的时候直接选择内存模式的爬虫,也可以使用 generator.py
模块新建爬虫时选择内存模式的爬虫
使用 generator.py
模块创建
generator.py
# -*- coding: utf-8 -*-
# @Author: yuanshaohang
# @Date: 2020-02-23 09:56:50
# @Version: 1.0.0
# @Description: 创建爬虫
from hunterx.utils.generator import production
# spider_dir: 爬虫分层目录名称(路径不存在时会自动创建,无需手动创建目录)
# spider_name: 创建的爬虫名称
# kernel_code: 需要使用的核心引擎 默认优先使用内存优先级队列,默认为3(内存队列),1为rabbitmq队列,2为redis队列
production(spider_name='memory_spider', kernel_code=3)
这样执行后就会在 spiders
目录下创建一个名为 memory_spider.py
的爬虫文件,并且该爬虫使用的是 内存优先级队列
模式,这个模式下你无需进行任何配置即可使用
使用方式
编辑 memory_spider.py
文件为下面的内容,然后执行。
memory_spider.py
# -*- coding: utf-8 -*-
import hunterx
from hunterx.spiders import MemorySpider
class MemorySpiderSpider(MemorySpider):
name = 'memory_spider'
def __init__(self):
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36'
}
def start_requests(self):
for i in range(100):
url = 'https://www.baidu.com/'
yield hunterx.Requests(url=url, headers=self.header, callback=self.parse, level=1)
async def parse(self, response):
print(f'parse 接收到的response: {response.status_code}')
for i in range(100):
url = 'https://www.baidu.com/'
yield hunterx.Requests(url=url, headers=self.header, callback=self.height_level, level=2)
async def height_level(self, response):
print(f'height_level 接收到的response: {response.status_code}')
if __name__ == '__main__':
start_run = MemorySpiderSpider()
start_run.run()
执行效果应该是先会在控制台出现大量的 height_level 接收到的response:
日志内容,少量的 parse 接收到的response:
内容
优先级分解说明
- 在以上代码示例中
start_requests
会先发起100
次请求,然后每个请求的返回结果都会回调传递给parse
方法 - 在
parse
方法中每接收到一次回调传递就会再次发起100
次请求,再将请求结果回调传递给height_level
方法 - 由于
parse
方法发起的请求的优先级参数level
级别设定的比start_requests
发起的请求优先级的级别高 - 所以会先将
parse
方法中发起的请求处理完成后再处理start_requests
发起的请求 - 也就是说
level
参数的设定很重要,它决定了优先处理哪个请求的逻辑
提示
在实际应用中,最佳实践应该是越接近数据的请求优先级设定应该更高
总结
内存模式是爬虫框架中最简单的一种队列管理方式,适用于 小规模
、快速开发
或 调试阶段
的使用。它的 高效性
和 简易性
是其主要优势,但也需要注意内存限制和无法持久化的缺点。