scrapy-redis需同时修改代码、配置、连接redis并变更启动方式,缺一不可:必须继承redisspider、删除start_urls/start_requests、设置一致的name和redis_key;settings中dupefilter_class、scheduler、scheduler_persist、redis_url四项配置必不可少,且须禁用本地调度与去重,任务需手动推入redis_key对应队列。

Scrapy-Redis 不是开箱即用的“分布式开关”,它需要同时改代码、调配置、连 Redis、启动方式也得换——漏掉任一环,爬虫就还在单机跑。
scrapy_redis.spiders.RedisSpider 必须替换原 Spider 类
继承 scrapy.Spider 的爬虫不会接入 Redis 队列,哪怕其他配置全对。必须显式改成 scrapy_redis.spiders.RedisSpider(或 RedisCrawlSpider)。
- 删掉
start_urls和start_requests()方法,否则 Scrapy 会走本地调度器,直接跳过 Redis - 设置
redis_key,比如redis_key = 'news_spider:start_urls',这是后续往 Redis 推任务的键名 - 多个节点运行时,所有机器上的爬虫类名(
name)和redis_key必须完全一致,否则键名不匹配,任务取不到
settings.py 里这 4 个配置项缺一不可
只装了 scrapy-redis 包但没配对 settings,等于没装。重点不是“开了什么”,而是“关掉了什么”——默认的本地去重和调度器必须被显式禁用。
-
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter':启用 Redis 去重,否则仍走内存去重(scrapy.dupefilters.RFPDupeFilter) -
SCHEDULER = 'scrapy_redis.scheduler.Scheduler':替换默认调度器,否则请求进不了 Redis 队列 -
SCHEDULER_PERSIST = True:避免爬虫退出时清空队列;设为False会导致重启后任务丢失 -
REDIS_URL = 'redis://:password@192.168.1.100:6379/0'或拆成REDIS_HOST/REDIS_PORT/REDIS_PARAMS:必须可连,用redis-cli -h 192.168.1.100 -p 6379 ping先验证通不通
注意:JOBDIR 如果存在,会强制启用本地文件去重,直接绕过 RFPDupeFilter,务必删掉或注释。
任务不是“启动就自动进队列”,得手动 push 到 redis_key 对应的 list
Scrapy-Redis 不会自动把 start_urls 同步到 Redis。你得自己用 redis-cli 或脚本往 redis_key 指定的 key 里塞 URL。
- 命令行推入:
redis-cli lpush news_spider:start_urls "https://news.qq.com/a/20260417/001234.htm" - Python 脚本推入:用
redis.StrictRedis连上后调r.lpush('news_spider:start_urls', url) - 别往
news_spider:dupefilter写数据——它是只读集合,写入会导致去重失效 - 如果误执行
DEL news_spider:requests,正在运行的爬虫会卡在BRPOP上,直到新任务进来
Redis 服务本身要允许远程连接,且安全组/防火墙得放行端口
本地开发时连 localhost 没问题,一上集群就容易卡在这儿。云服务器(如腾讯云、阿里云)默认 Redis 绑定 127.0.0.1,且开启 protected-mode yes,外部根本连不上。
- 修改 Redis 配置:
bind 0.0.0.0(或指定内网 IP),protected-mode no,requirepass yourpassword - Linux 服务器需确认
firewall-cmd --list-ports或ufw status是否放行6379 - 云厂商必须在安全组里添加入方向规则:端口
6379,源 IP 可设为爬虫节点 IP 段或0.0.0.0/0(测试用,生产慎用)
真正容易被忽略的是:Redis 内存占用随 spider:requests(未消费请求)和 spider:dupefilter(历史指纹)持续增长,长期运行必须监控 INFO memory 中的 used_memory_human,不然某天 OOM 就静默崩了。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











