Scrapy自动限速AutoThrottle完全指南
📂 所属阶段:第三阶段 — 攻防演练(中间件与反爬篇)
🔗 相关章节:Downloader Middleware · 代理IP池集成 · 反爬对抗实战
目录
AutoThrottle是什么?
AutoThrottle是Scrapy内置的下载中间件,替代了静态的DOWNLOAD_DELAY,能根据目标网站的响应负载动态调节请求间隔和并发数,实现“人性化访问”:
- 既不浪费时间爬得太慢
- 又不给服务器造成过大压力触发反爬
为什么不直接用静态延迟?
静态延迟太“死板”:
- 低峰期网站响应快,但还是按固定5秒爬,效率低
- 高峰期网站响应慢,固定延迟反而增加服务器压力/触发限流
- 新网站难预估延迟,调大调小都踩坑
工作原理(简化版)
AutoThrottle不需要复杂算法,核心逻辑很直观:
- 初始阶段:用
AUTOTHROTTLE_START_DELAY作为初始请求间隔 - 学习阶段:抓取过程中持续记录平均响应时间
- 调节阶段:
- 目标延迟≈平均响应时间÷目标并发数(默认1.0,即单站点“等待上一个响应→发下一个”)
- 延迟严格控制在
AUTOTHROTTLE_START_DELAY和AUTOTHROTTLE_MAX_DELAY之间
- 并发约束:不会超过全局
CONCURRENT_REQUESTS和单域名CONCURRENT_REQUESTS_PER_DOMAIN
核心配置参数
只需要在settings.py里启用并调几个参数即可上手:
关键参数说明(避坑用)
- 不要同时设
DOWNLOAD_DELAY:AutoThrottle会覆盖/干扰它 AUTOTHROTTLE_TARGET_CONCURRENCY别超过全局并发数的1/3:防止单个域名占满资源AUTOTHROTTLE_MAX_DELAY别设太长:比如超过120秒,不如直接暂停重试
场景化高级配置
1. 保守模式(高防护网站:微博、知乎、小红书)
2. 平衡模式(普通网站:新闻站、博客站)
3. 激进模式(公开API、数据接口)
最简单的自定义限速
如果内置AutoThrottle不够用(比如需要区分AJAX和普通请求、加随机抖动防规律),可以继承内置AutoThrottle修改,不用重写整个中间件:
启用自定义中间件
在settings.py里替换内置AutoThrottle:
常见问题与最佳实践
常见问题
1. 爬虫速度还是很慢?
排查方向:
- 是不是同时设了
DOWNLOAD_DELAY?赶紧删掉 - 是不是
AUTOTHROTTLE_TARGET_CONCURRENCY设太低了?调到2-5试试 - 是不是
CONCURRENT_REQUESTS全局限制了?比如设成8,可以提到16-32(只要目标网站不封)
2. 还是被封IP?
- 别单独依赖AutoThrottle,配合代理IP池、User-Agent轮换、Cookie池一起用
- 换保守模式:
AUTOTHROTTLE_TARGET_CONCURRENCY=0.5,单域名串行 - 观察AutoThrottle的调试日志,如果延迟一直压在
MAX_DELAY,说明网站负载很高,建议暂停10-30分钟再爬
3. AutoThrottle的延迟总是跳变?
这是正常的!因为它是动态学习的,刚开始数据少跳变多,爬20-30个页面后就稳定了。
最佳实践
- 开发先用保守模式+调试日志:先摸清楚目标网站的响应特性
- 必须加随机抖动:不管是内置还是自定义,防规律是反爬的关键
- 单个域名的并发别超过4:除非是明确的公开API
- 定期保存爬取状态:用Scrapy的
JOBDIR,如果被封可以暂停换IP后继续 - 监控响应状态码:如果连续出现429(限流)、403(禁止访问),立即暂停并调整策略
💡 核心要点总结: AutoThrottle是Scrapy最实用的反爬工具之一,不要自己瞎写复杂的限速算法,先把内置的用好,再根据需求微调。配合代理、UA轮换、Cookie,能解决80%的反爬问题。

