Spider Middleware完全指南 - 数据预处理与后处理技术详解
📂 所属阶段:第五阶段 — 战力升级(分布式与进阶篇)
🔗 相关章节:Downloader Middleware · Pipeline管道实战
目录
核心基础与位置
Spider Middleware是Scrapy引擎与Spider之间的钩子组件,用于拦截两类数据:
- 到达Spider前的响应Response(预处理)
- Spider生成后离开的Items/Requests(后处理)
Scrapy请求处理简化流程(突出核心位置): Engine → Scheduler → [Downloader] → Engine → 输入层 → Spider → 输出层 → Engine → [Pipeline/Scheduler]
配置与极简生命周期
配置说明(优先级表格)
优先级范围:0-1000,数字越小越先处理输入、先处理输出。
三大核心方法调用规则
📌 记住核心返回值规则,避免踩坑:
process_spider_input(response, spider):响应到达Spider前触发- 返回
None:继续传递 - 抛出异常:中断→跳转到异常处理
- 返回
process_spider_output(response, result, spider):Spider生成结果后触发- 必须返回可迭代对象(生成器优先,节省内存)
process_spider_exception(response, exception, spider):输入/Spider内部抛异常时触发- 返回
None:继续传递异常 - 返回可迭代对象:异常处理完成
- 返回
三大核心方法实战
3.1 输入预处理:反爬检测+编码修正
合并两个高频场景,快速过滤无效响应并修正编码:
3.2 输出后处理:数据增强+文本清洗
合并基础增强(去重标记、来源、时间)和文本清洗(去多余空格):
3.3 异常分类处理:重试+跳过
处理最常见的两类异常,避免爬虫中断:
高频场景:分布式前置去重
Pipeline去重已经太晚(浪费了Spider的处理资源),用Spider Middleware的输出层前置去重更高效,依赖前面的_item_md5和Redis实现:
避坑指南&最佳实践
⚠️ 避坑指南(Top3)
- 优先级搞反:
- 输入层:先反爬→再编码→优先级400(反爬)< 500(编码)
- 输出层:先增强→再去重→优先级400(增强)< 500(去重)
- 内存泄漏:
- 不要存大量实例/全局缓存(如需缓存,用
functools.lru_cache或Redis) - 输出处理用生成器,别转成列表
- 不要存大量实例/全局缓存(如需缓存,用
- 异常吞掉:
- 别随便返回可迭代对象,除非明确处理逻辑
- 返回前必须记录日志
🎯 最佳实践(Top4)
- 单一职责:每个中间件只做1-2件事(比如反爬+编码,不要混OCR)
- 可配置:把参数放到settings.py(重试次数、Redis地址)
- 前置去重:用输出层做Item前置去重,比Pipeline省资源
- 轻量处理:CPU密集型操作扔到Pipeline或异步任务(如Celery)
🔗 相关教程推荐
- Downloader Middleware - 请求响应处理
- Pipeline管道实战 - 数据处理管道
- Selector 选择器 - 数据提取技术
🏷️ 标签云: Scrapy Spider Middleware 数据预处理 数据后处理 异常处理 网络爬虫

