Scrapy-Redis爬虫未返回结果至crawler:items,该如何排查?
Scrapy-Redis + Docker 无结果返回排查步骤
1. 先确认基础运行状态
- 执行
docker-compose ps,检查Redis、Scrapy Worker容器是否处于Up状态,有没有频繁重启、退出的情况 - 查看容器日志定位基础错误:
- Redis日志:
docker-compose logs redis,确认Redis启动正常,无连接拒绝、权限异常 - Scrapy Worker日志:
docker-compose logs scrapy-worker,重点看是否有爬虫启动失败、Redis连接报错、解析错误等日志,同时留意是否有start_urls被读取的记录
- Redis日志:
2. 追踪Redis队列的数据流
- 进入Redis容器命令行:
docker exec -it <redis容器ID> redis-cli,检查核心队列:- 待爬队列:
llen 你的爬虫名:requests,确认提交的start_urls是否已进入队列 - 处理中队列:
llen 你的爬虫名:requests:processing,如果数值持续不为0,说明请求卡在处理环节 - 重试队列:
llen 你的爬虫名:requests:retry,数值过大意味着请求一直在重试,大概率是目标站反爬、请求参数错误 - 已完成队列:
llen 你的爬虫名:requests:done,确认是否有请求被处理完成
- 待爬队列:
3. 核对Scrapy-Redis配置
- 打开Scrapy的
settings.py,确认关键配置:REDIS_URL是否对应Docker内Redis的地址(比如redis://redis:6379/0,Docker-compose中服务名可直接解析)SCHEDULER是否设为scrapy_redis.scheduler.SchedulerDUPEFILTER_CLASS是否设为scrapy_redis.dupefilter.RFPDupeFilterITEM_PIPELINES是否包含scrapy_redis.pipelines.RedisPipeline,且优先级设置合理(比如300)SCHEDULER_PERSIST是否为True,避免爬虫停止后队列被清空
4. 单独调试爬虫代码
- 脱离Docker环境,本地运行爬虫:拉取代码到本地,安装依赖后执行
scrapy crawl 你的爬虫名,看是否能正常生成Item,有没有解析报错 - 检查爬虫核心逻辑:
parse方法是否正确返回Item对象,有没有因响应状态码异常(如403、500)直接跳过Item生成- 是否存在无限递归请求,导致爬虫一直在爬取新链接,无法输出结果
- 提交的
start_urls格式是否正确,有没有漏写协议(如http://)、域名拼写错误
5. 排查Docker网络连通性
- 进入Scrapy Worker容器:
docker exec -it <Scrapy容器ID> bash - 测试Redis连通性:用
telnet redis 6379或redis-cli -h redis ping,确认容器间网络互通 - 检查Docker-compose网络配置:确保所有服务都在同一个自定义网络或默认网络下,无网络隔离情况
6. 验证Redis数据与权限
- 通过RedisInsight检查是否存在其他类似命名的Item键(比如爬虫名写错导致键为
spider_test:items而非预期的crawler:items) - 确认Redis未设置密码,或Scrapy配置中已正确填写
REDIS_PASSWORD - 检查Redis持久化配置,避免数据因容器重启丢失
内容的提问来源于stack exchange,提问作者rayad
相关产品推荐
相关产品推荐

