Scrapy-Redis的三个核心组件必须同时启用:调度器(Scheduler)、去重过滤器(DupeFilter)和Redis连接配置(REDIS_URL),缺一不可,否则无法实现真正的分布式爬取。

Scrapy 本身不支持分布式,必须靠 scrapy-redis 插件补足调度、去重、队列共享能力。没装这个,起再多节点也各自为政,根本不是“分布式”。
scrapy-redis 的三个核心组件必须同时启用
scrapy-redis不是“装了就能用”的黑盒,它把原生 Scrapy 的三块关键逻辑替换成 Redis 支持版本,缺一不可:
• SCHEDULER="scrapy_redis.scheduler.Scheduler":替换默认调度器,让所有节点从同一个 Redis list(或 priority queue)里取 URL
• DUPEFILTER_CLASS="scrapy_redis.dupefilter.RFPDupeFilter":全局去重靠 Redis 的 set 或 bloom filter,不是各节点自己维护 fingerprint
• REDIS_URL="redis://127.0.0.1:6379/0" 或 REDIS_HOST+REDIS_PORT:所有节点必须指向同一 Redis 实例,否则队列和去重就分家了
漏配任意一项,常见现象是:多个爬虫同时跑,但只有一台在干活;或者反复抓同一页面;或者断点后任务全丢。
RedisSpider 和 RedisCrawlSpider 的选择依据
不是所有场景都适合 RedisSpider。它只从 Redis 读 start_urls,不自动跟进链接——除非你手动 yield request 并 push 到 Redis。
• 用 RedisSpider:适合“种子 URL 固定、无需深度遍历”的场景,比如批量抓首页列表页
• 用 RedisCrawlSpider:继承自 CrawlSpider,支持 Rule 和自动 link extract,但要求你把 start_urls 写死或通过 redis_key 注入,且跟进逻辑仍需显式 push 到 Redis 队列(否则新链接只在本机内存里流转)
注意:redis_key 是 Redis 中实际存储 URL 的 key 名,必须和 settings.py 中的 REDIS_START_URLS_KEY 或默认值一致,否则爬虫启动时读不到任何 URL。
并发控制与 Redis 连接稳定性直接挂钩
很多人调高 CONCURRENT_REQUESTS 后出现超时或连接拒绝,其实问题不在 Scrapy,而在 Redis 客户端连接池和服务器配置。
• 默认的 redis-py 连接池最大连接数是 10,如果 5 台机器每台开 20 并发,Redis 很快打满
华为云 Python SDK 查询工具。自动发现已安装 SDK 的服务包、Client类、API 方法、入参详情、类信息(__init__ 参数、属性、类型、描述),支持关键字搜索,快速定位目标 API 使用方法。
• 解决方法是在 settings.py 加:REDIS_PARAMS={"max_connections": 50}
• 同时检查 Redis 服务端配置:maxclients 值是否足够(默认 10000,但 Docker 部署常被限制在 128)
• 更隐蔽的坑:REDIS_URL 若带密码,必须用 redis://:password@host:port/db 格式,漏掉冒号或斜杠会导致认证失败却静默降级为无密码连接。
断点续爬依赖 SCHEDULER_PERSIST=True,但别忘了清理 stale 数据
SCHEDULER_PERSIST=True确保爬虫意外中断后,未完成的 request 仍留在 Redis 队列里。但这也会导致:重启前没清空队列,上次失败的 URL 会反复重试。
• 生产环境建议配合脚本定期清理:redis-cli DEL my_spider:requests(队列)和 my_spider:dupefilter(去重集合)
• 如果用了 Scrapyd 部署,scrapyd-client 上传的 egg 包不会自动同步 settings 变更,改了 SCHEDULER_PERSIST 必须重新 deploy
• Redis 中的 key 名默认由 spider.name 拼接而成,多项目共用一个 Redis 时,务必用不同 name 或显式设置 REDIS_START_URLS_KEY,否则互相污染。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










