分布式爬虫必须用redis统一调度代理、分发任务、维护状态,否则多节点必撞ip、抢资源、漏剔除废代理;scrapy-redis的scheduler与dupefilter_class须指向同一redis实例,且代理池需用zset+hash结构智能管理,节点并发、延迟与自动节流须协同配置。

直接说结论:分布式爬虫集群的代理与任务执行环境,不能靠“每个节点自己配一份代理列表”或“本地启一堆进程”,必须用 Redis 统一调度代理、统一分发任务、统一维护状态。否则多节点必然撞 IP、抢资源、漏剔除废代理,上线三天就崩。
Scrapy-Redis 的 SCHEDULER 和 DUPEFILTER 必须指向同一 Redis 实例
这是最常被忽略的基础前提。如果你的 settings.py 里只改了 SCHEDULER 却没同步改 DUPEFILTER_CLASS,或者两个配置用了不同 DB(比如一个连 db=0,一个连 db=1),就会出现:节点 A 刚把 URL 入队,节点 B 立刻又去重失败后重复抓——因为去重集合和请求队列根本不在一块儿。
正确做法:
SCHEDULER = "scrapy_redis.scheduler.Scheduler"DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"-
REDIS_URL = "redis://:pwd@192.168.1.100:6379/0"(所有节点共用这个连接串) - 确保 Redis 实例开启了
notify-keyspace-events(用于监听队列变化,Scrapy-Redis 依赖它触发调度)
代理池必须走 Redis 共享,且用 zset + hash 结构管理权重与状态
单机用 random.choice(proxy_list) 在分布式下就是灾难。真实线上环境要用 Redis 的 zset 存代理(score 为可用分),hash 存每个代理的调用次数、失败次数、最后成功时间——这样中间件才能做智能轮换、自动降权、秒级剔除。
示例中间件逻辑关键点:
- 每次请求前从
zrangebyscore proxy:available 1 100拿高分代理,不是无脑spop - 请求失败后,用
zincrby proxy:available -50 "http://user:pass@1.2.3.4:8080"降低其分数 - 连续失败 3 次,自动
sadd proxy:dead并从可用集移除 - 避免用
get_random_key类操作——Redis 集群模式下不支持,会报MOVED错误
任务执行节点要限制并发数,且必须设 DOWNLOAD_DELAY + AUTOTHROTTLE_ENABLED
很多人以为“加机器=加速度”,结果所有节点全开 16 并发往同一个目标站猛砸,5 分钟就被封光 IP。分布式不是放大器,是协同器。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
生产环境推荐配置组合:
-
CONCURRENT_REQUESTS = 8(每节点上限,别碰 16+) -
DOWNLOAD_DELAY = 1.5(强制间隔,比纯随机更可控) -
AUTOTHROTTLE_ENABLED = True,配合AUTOTHROTTLE_START_DELAY = 1和AUTOTHROTTLE_MAX_DELAY = 5 - 禁用
RETRY_TIMES默认值(太激进),设为2,重试交给代理轮换兜底,不是靠反复撞同一个 IP
注意:AUTOTHROTTLE 依赖响应头里的 Retry-After 或响应延迟反馈,如果目标站不返回这些,它基本不生效——得靠前面的 DOWNLOAD_DELAY 扛底。
Redis 主从哨兵架构下,scrapy-redis 连接必须用哨兵客户端,不能直连主节点
2025 年后新部署的集群,几乎没人再用单点 Redis。但很多团队在 settings.py 里还写 REDIS_URL = "redis://master:6379",一旦主节点宕机、哨兵切从为新主,所有爬虫节点立刻卡死——因为 scrapy-redis 原生不支持自动重连哨兵。
解决方式只有两个:
- 换用
scrapy-redis-sentinel包(非官方,但已稳定用于多个百万级项目) - 或手动封装
StrictRedis.from_url()为哨兵客户端,并重写from_settings方法注入到 Scheduler 中 - 测试时务必模拟主节点宕机(
redis-cli -p 6379 DEBUG sleep 30),看节点是否在 10 秒内自动切到新主并继续消费
真正难的从来不是写代码,而是让所有节点在 Redis 故障、代理失效、目标站限流这三件事同时发生时,还能静默降级、不丢任务、不炸日志。这点,90% 的所谓“分布式爬虫”都没过线。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










