如何在Scrapy Shell交互会话中启用并使用Scrapy middleware
Scrapy Shell中启用项目Middleware的通用配置方法
完全可以实现,不需要魔改Scrapy源码,几种常用方案覆盖不同调试场景:
- 优先用默认加载逻辑,先排查路径问题
绝大多数人遇到的middleware不生效问题,都是启动shell时不在Scrapy项目根目录,框架没识别到项目配置。只要cd到scrapy.cfg所在的项目根目录再执行scrapy shell 目标调试URL,框架会自动读取settings.py里配置的所有下载中间件、爬虫中间件,不需要额外配置。
启动后可以在交互环境跑下面的命令验证配置是否加载成功:from scrapy.utils.project import get_project_settings # 打印下载中间件配置,和你settings里写的一致就说明加载正常 print(get_project_settings().get("DOWNLOADER_MIDDLEWARES")) - 非项目根目录启动时显式指定配置
如果不想切目录,启动时通过--set参数显式传入项目配置路径即可:scrapy shell --set=SPIDER_MODULES=你的项目包名.spiders --set=NEWSPIDER_MODULE=你的项目包名.spiders "https://调试目标地址" - 已打开Shell的场景下动态挂载Middleware
如果已经进入交互环境不想重启,可以直接给当前crawler实例手动注册中间件:
挂载完成后执行# 导入你的自定义中间件 from 你的项目包名.middlewares import CustomDownloaderMiddleware # 给当前下载器挂载中间件,第二个参数是执行优先级,数字越小越靠前 crawler.engine.downloader.middlewares._add_middleware(CustomDownloaderMiddleware, priority=550)fetch(目标url),请求就会经过你刚注册的中间件处理。 - 高频调试场景可以做固定启动脚本
如果你经常需要在shell里调试带中间件的逻辑,可以在项目根目录写个初始化脚本shell_boot.py,提前把需要加载的中间件、测试头、测试参数都写好,启动时直接加载就行:scrapy shell -c "exec(open('shell_boot.py').read())"
踩坑提示:不要直接在shell里手动构造Response对象测试爬虫中间件逻辑,一定要用
fetch()方法发起完整请求,不然中间件的请求、响应处理流程不会被触发。
内容的提问来源于stack exchange,提问作者thinwybk
相关产品推荐
相关产品推荐

