Python爬虫工程化核心是可维护性,需分层设计(spiders/pipelines/storages/utils)、配置外置(base/dev/prod三级+dotenv)、可测试性前置(注入session、纯函数pipeline)、可观测降级(结构化日志、Prometheus指标、Redis动态降级)。

Python爬虫项目一旦脱离脚本阶段,进入工程化交付或长期维护,结构混乱、逻辑耦合、配置分散、调试困难就会迅速成为瓶颈。核心不是“能不能爬”,而是“能不能改、能不能测、能不能交、能不能扛住变化”。模块化是手段,可维护性才是目标。
分层清晰:按职责切分,不按技术切分
避免按“requests / bs4 / selenium”来建包,而应按业务语义分层:
- spiders/:只负责发起请求、解析原始响应、提取原始数据(如商品标题、价格、URL),不处理清洗、去重、存储逻辑
- pipelines/:专注数据流转后处理——字段标准化(如价格转float)、空值填充、敏感信息脱敏、数据校验
- storages/:封装不同落库方式(MySQL、MongoDB、CSV、API推送),上层调用只认接口,不关心驱动细节
- utils/:提供跨模块的通用能力,如随机User-Agent池、代理轮询器、重试装饰器、日志配置器
配置外置:环境与策略解耦
硬编码URL、超时、重试次数、数据库地址,等于给维护埋雷。推荐三级配置管理:
- config/base.py:所有环境共用的基础配置(如默认headers模板、基础重试策略)
- config/dev.py / config/prod.py:环境特有配置(开发用本地SQLite、生产走Redis去重+MySQL主库)
- .env:存放密钥、token、数据库密码等敏感项,通过python-decouple或dotenv加载,不进Git
启动时通过环境变量指定配置文件,例如ENV=prod python main.py,自动加载对应配置。
立即学习“Python免费学习笔记(深入)”;
可测试性前置:每个模块都该有独立入口和mock边界
爬虫最难测的不是网络,而是逻辑。关键做法:
- spider类方法不直接调用requests.get(),而是接收一个可注入的session对象,单元测试时传入responses或httpx.MockTransport
- pipeline函数设计为纯函数:输入dict,输出dict,无副作用;测试只需构造样例数据,断言字段转换是否正确
- 在tests/下按模块组织,如tests/spiders/test_jd_spider.py,用pytest参数化覆盖不同页面结构(正常页、缺字段页、反爬跳转页)
可观测与降级:上线后不靠“看日志猜问题”
工程化系统必须自带“自省力”:
- 每个spider运行前后记录耗时、请求数、成功数、异常类型及频次,统一打到结构化日志(如JSON格式),接入ELK或Loki
- 关键环节加轻量级指标:Redis去重命中率、MySQL写入失败率、Pipeline处理延迟,用Prometheus Client暴露/metrics端点
- 设置可动态开关的降级策略:如某站点连续5次超时,自动暂停该spider 30分钟,并发数减半;通过Redis Flag控制,无需重启服务










