Scrapy-Redis 里面提供哪些即开即用的功能能力模块

Scrapy-Redis 即开即用功能模块


📦 核心模块一览

arduino 复制代码
scrapy_redis/
├── scheduler.py      → 分布式调度器
├── dupefilter.py     → 分布式去重过滤器
├── queue.py          → 多种 Redis 队列实现
├── spider.py         → 分布式 Spider 基类
├── pipelines.py      → Redis Item 管道
├── connection.py     → Redis 连接管理
└── picklecompat.py   → 序列化兼容层

1️⃣ 分布式调度器 Scheduler

替换 Scrapy 默认调度器,核心枢纽

python 复制代码
# settings.py
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

SCHEDULER_PERSIST = True        # 重启后队列不清空,断点续爬
SCHEDULER_FLUSH_ON_START = False # 启动时不清空队列

能力:

  • 将所有待爬 URL 统一存入 Redis,多节点共享
  • 支持持久化(进程崩溃后恢复队列)
  • 自动与去重器配合

2️⃣ 分布式去重器 RFPDupeFilter

基于 Redis Set 的全局去重

python 复制代码
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

原理:

scss 复制代码
URL → fingerprint(sha1) → SADD redis_key → 
  已存在 → 丢弃
  不存在 → 入队

⚠️ 默认用 Redis Set,内存占用较大;大规模需替换为 Bloom Filter (scrapy-redis-blfilter)


3️⃣ 三种 Redis 队列 Queue

队列类 Redis 结构 特性
SpiderQueue List (FIFO) 默认,先进先出
SpiderStack List (LIFO) 后进先出,深度优先
SpiderPriorityQueue ZSet 按优先级排序 ✅ 推荐
python 复制代码
# 切换队列类型
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

4️⃣ 分布式 Spider 基类

RedisSpider --- 从 Redis 读取起始 URL

python 复制代码
from scrapy_redis.spiders import RedisSpider

class MySpider(RedisSpider):
    name = "my_spider"
    redis_key = "my_spider:start_urls"  # 监听的 Redis key

    def parse(self, response):
        ...
bash 复制代码
# 外部注入起始任务
redis-cli LPUSH my_spider:start_urls "https://example.com"

RedisCrawlSpider --- 带规则的分布式爬虫

python 复制代码
from scrapy_redis.spiders import RedisCrawlSpider
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor

class MyCrawler(RedisCrawlSpider):
    name = "crawler"
    redis_key = "crawler:start_urls"
    rules = (
        Rule(LinkExtractor(allow=r"/article/"), callback="parse_item"),
    )

5️⃣ Redis Item Pipeline

将爬取结果直接写入 Redis

python 复制代码
ITEM_PIPELINES = {
    "scrapy_redis.pipelines.RedisPipeline": 300
}

REDIS_ITEMS_KEY = "%(spider)s:items"    # 存储 key
REDIS_ITEMS_SERIALIZER = "json"         # 序列化格式

通常作为中间缓冲,再由消费者进程写入 MySQL/MongoDB


6️⃣ 连接管理 connection

统一管理 Redis 连接,支持多种配置方式:

python 复制代码
# 方式1:URL
REDIS_URL = "redis://:password@host:6379/0"

# 方式2:分项配置
REDIS_HOST = "127.0.0.1"
REDIS_PORT = 6379
REDIS_DB = 0
REDIS_PARAMS = {"password": "xxx", "socket_timeout": 30}

功能模块关系图

scss 复制代码
[外部] LPUSH start_urls
        ↓
  RedisSpider (监听)
        ↓
  Scheduler (调度器)  ←→  Redis Queue (待爬 URL)
        ↓                       ↑
  RFPDupeFilter (去重)   新发现的 URL
        ↓
  Scrapy 下载器 → parse()
        ↓
  Item Pipeline → RedisPipeline → Redis Items

快速启用配置模板

python 复制代码
# settings.py 最小配置
REDIS_URL = "redis://localhost:6379/0"

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"

DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

ITEM_PIPELINES = {
    "scrapy_redis.pipelines.RedisPipeline": 300
}

6 个模块,settings.py 改 5 行,单机 Scrapy 即变分布式。

相关推荐
郑州光合科技余经理7 分钟前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆66643 分钟前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)1 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
lsc_blog1 小时前
远程和居家办公的经历,技术简历上怎么摆
面试·职场和发展·重构·pdf·求职招聘
码艺-Alimjan2 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_2 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒2 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技3 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
时间的拾荒人3 小时前
Qt 事件机制全解析:从事件处理到事件过滤器
开发语言·qt·面试
yivifu3 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub