bigywater.tech
Scrapy · 16

DOWNLOAD_DELAY 与 RANDOMIZE_DOWNLOAD_DELAY:请求间隔的真实分布

DOWNLOAD_DELAY 设成 0.2 秒,请求之间的间隔真的是 200 毫秒吗?抖动开着的时候间隔是什么分布?这篇在服务器端记录每个请求到达的时间,把间隔分布、慢响应的影响、多域名与单域名覆盖都量出来。

243 ms
DOWNLOAD_DELAY = 0.2、默认抖动时的平均请求间隔(设置值 200 ms)
3.0 s
24 个请求、延迟 0.1、每个耗时 0.6 s 时的总耗时(延迟按发出到发出)
51 / 301 ms
DOWNLOAD_SLOTS 给两个域名分别设 0.05、0.3 s 后的实际间隔

抖动的影响

实测 · 本机执行输出
  DOWNLOAD_DELAY_JITTER=(默认)  间隔 ms:最小 125、P10 169、中位数 253、P90 290、最大 300、平均 243;总耗时 24.2 s
  DOWNLOAD_DELAY_JITTER=0     间隔 ms:最小 186、P10 200、中位数 201、P90 202、最大 251、平均 201;总耗时 20.1 s
  DOWNLOAD_DELAY_JITTER=0.5   间隔 ms:最小 125、P10 162、中位数 256、P90 293、最大 301、平均 244;总耗时 24.4 s
  DOWNLOAD_DELAY_JITTER=1.0   间隔 ms:最小 30、P10 129、中位数 300、P90 392、最大 401、平均 286;总耗时 28.5 s

2.19 里 DOWNLOAD_DELAY_JITTER(默认 0.5)取代旧的 RANDOMIZE_DOWNLOAD_DELAY。开着抖动时,实际平均间隔比设置值长约 20%——每次放行前都重新抽一次随机延迟,延迟没到才继续等,所以间隔偏向抖动范围的上端。要精确的节奏就把抖动设成 0。

RANDOMIZE_DOWNLOAD_DELAY

实测 · 本机执行输出
  RANDOMIZE_DOWNLOAD_DELAY=False 间隔 ms:最小 199、P10 200、中位数 201、P90 202、最大 218、平均 201
      警告:The RANDOMIZE_DOWNLOAD_DELAY setting is deprecated, use DOWNLOAD_DELAY_JITTER instead: it takes the magnitude of the random variation as a number, e.g
  RANDOMIZE_DOWNLOAD_DELAY=True  间隔 ms:最小 118、P10 156、中位数 244、P90 291、最大 301、平均 232
      警告:The RANDOMIZE_DOWNLOAD_DELAY setting is deprecated, use DOWNLOAD_DELAY_JITTER instead: it takes the magnitude of the random variation as a number, e.g

旧设置 RANDOMIZE_DOWNLOAD_DELAY 仍然生效(False 关掉抖动,True 开启 ±50%),但已弃用并会警告。

发出到发出

实测 · 本机执行输出
  间隔 ms:最小 96、P10 100、中位数 101、P90 102、最大 104、平均 101;服务器同时处理的峰值 7(≈ 0.6 ÷ 0.1 = 6);总耗时 3.0 s(24×0.1 + 0.6 ≈ 3.0)

延迟计的是两个请求先后放行的间隔,不等响应。响应慢时,延迟不变,在途请求数变成响应耗时除以延迟。

按域名计时

实测 · 本机执行输出
  一个域名 20 个请求:总耗时 4.0 s;两个域名各 20 个(共 40 个):总耗时 4.0 s;理想值 20×0.2 = 4.0 s
  两个域名的请求到达顺序(1=127.0.0.1,l=localhost):l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1l1

每个下载槽(域名)独立计时,两个域名同时爬不会互相等待。

DOWNLOAD_SLOTS

实测 · 本机执行输出
  127.0.0.1 间隔 ms:最小 50、P10 50、中位数 51、P90 52、最大 53、平均 51
  localhost 间隔 ms:最小 297、P10 300、中位数 301、P90 302、最大 302、平均 301
  总耗时 5.7 s(localhost 慢的那个决定:20×0.3 = 6.0)

DOWNLOAD_SLOTS 可以给某个域名单独设置 delay(以及 concurrency、jitter),比全局设置优先。

spider 的 download_delay 属性

实测 · 本机执行输出
  只有 spider.download_delay = 0.3:间隔 ms:最小 300、P10 300、中位数 301、P90 303、最大 303、平均 301
  警告:The 'download_delay' spider attribute is deprecated. Use the DOWNLOAD_DELAY setting instead.

旧写法 download_delay = 0.3 作为 spider 优先级的设置仍然生效,同样会警告弃用。

分步演示

下载延迟
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.8 / Scrapy 2.19.0 / Twisted 26.4.0 / lxml 6.1.3 / parsel 1.12.1(临时虚拟环境);所有请求只发给本机自己起的测试服务器(127.0.0.1,端口 9960 以上,不访问任何真实网站);服务器可以按实验需要制造延迟、重定向、压缩、断连等行为,并记录收到的原始请求;每个实验在临时目录里新建 Scrapy 项目或单文件 spider,命令输出来自真实的 scrapy 进程;计时用 time.perf_counter,数字每次运行会有小幅抖动。服务器端记录每个请求到达的时刻,统计相邻请求的间隔;/seed 请求不计入;抖动实验的样本是 99 个间隔
    • 没有验证:AutoThrottle 对延迟的调整(下一批文章);真实网络时延下抖动分布;用 Request.meta 的 download_slot 把多个域名合并成一个槽(见槽那一篇);各次运行之间的数字会有几毫秒的偏差(表中是最后一次运行);“偏向上端”的原因是读源码 _process_queue 得到的推断,没有逐次验证
    京ICP备2026067502号-1京公网安备11010502063487号