AutoThrottle 扩展

这是一个用于根据 Scrapy 服务器和您正在抓取的网站的负载自动调节抓取速度的扩展。

设计目标

  1. 对网站更友好,而不是使用默认的零下载延迟

  2. 自动将 Scrapy 调整到最佳抓取速度,这样用户就不必调整下载延迟来找到最佳值。用户只需指定允许的最大并发 Request 数,其余由扩展完成。

工作原理

Scrapy 允许定义不同下载槽的并发和延迟,例如通过 DOWNLOAD_SLOTS 设置。默认情况下,Request 根据其 URL 域分配到槽中,但也可以自定义任何 Request 的下载槽。

AutoThrottle 扩展动态调整每个下载槽的延迟,以使您的爬虫平均向每个远程网站发送 AUTOTHROTTLE_TARGET_CONCURRENCY 个并发 Request。

它使用下载延迟来计算延迟。主要思想如下:如果服务器需要 latency 秒响应,客户端应每 latency/N 秒发送一个 Request,以便并行处理 N 个 Request。

与其调整延迟,不如设置一个较小的固定下载延迟,并使用 CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP 选项施加硬性的并发限制。这会产生类似的效果,但有一些重要区别

  • 由于下载延迟较小,偶尔会出现请求爆发;

  • 通常非 200(错误)响应返回速度比常规响应快,因此在下载延迟较小和并发限制严格的情况下,当服务器开始返回错误时,爬虫会更快地向服务器发送请求。但这与爬虫应有的行为相反——出现错误时,减慢速度更有意义:这些错误可能由高请求率引起。

AutoThrottle 没有这些问题。

节流算法

AutoThrottle 算法根据以下规则调整下载延迟

  1. 爬虫总是以 AUTOTHROTTLE_START_DELAY 的下载延迟开始;

  2. 收到 Response 后,目标下载延迟计算为 latency / N,其中 latency 是该 Response 的延迟,NAUTOTHROTTLE_TARGET_CONCURRENCY

  3. 后续 Request 的下载延迟设置为之前的下载延迟和目标下载延迟的平均值;

  4. 不允许非 200 Response 的延迟减少延迟;

  5. 下载延迟不能小于 DOWNLOAD_DELAY 或大于 AUTOTHROTTLE_MAX_DELAY

注意

AutoThrottle 扩展遵循 Scrapy 关于并发和延迟的标准设置。这意味着它会遵守 CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP 选项,并且绝不会将下载延迟设置低于 DOWNLOAD_DELAY

在 Scrapy 中,下载延迟被测量为建立 TCP 连接和接收 HTTP 头部之间经过的时间。

请注意,在协作式多任务环境中很难准确测量这些延迟,因为 Scrapy 可能正忙于处理爬虫回调等,而无法处理下载。然而,这些延迟仍然可以合理估计 Scrapy(最终是服务器)的繁忙程度,此扩展正是基于这一前提构建的。

阻止特定 Request 触发槽延迟调整

AutoThrottle 根据属于该下载槽的 Response 延迟来调整下载槽的延迟。唯一的例外是非 200 Response,它们仅在用于增加延迟时被考虑,如果会减少延迟则被忽略。

您还可以在任何 Request 中将 autothrottle_dont_adjust_delay Request 元数据键设置为 True,以防止其 Response 延迟影响其下载槽的延迟

from scrapy import Request

Request("https://example.com", meta={"autothrottle_dont_adjust_delay": True})

然而请注意,AutoThrottle 仍然通过设置运行中爬虫的 download_delay 属性来确定每个下载槽的起始延迟。如果您希望 AutoThrottle 完全不影响某个下载槽,除了在使用该下载槽的所有 Request 中设置此 meta 键外,您可能还需要为该下载槽的 delay 属性设置一个自定义值,例如使用 DOWNLOAD_SLOTS

设置

用于控制 AutoThrottle 扩展的设置有

更多信息请参阅工作原理

AUTOTHROTTLE_ENABLED

默认值: False

启用 AutoThrottle 扩展。

AUTOTHROTTLE_START_DELAY

默认值: 5.0

初始下载延迟(秒)。

AUTOTHROTTLE_MAX_DELAY

默认值: 60.0

在高延迟情况下设置的最大下载延迟(秒)。

AUTOTHROTTLE_TARGET_CONCURRENCY

默认值: 1.0

Scrapy 应平均并行发送到远程网站的 Request 数。必须高于 0.0

默认情况下,AutoThrottle 调整延迟以向每个远程网站发送单个并发 Request。将此选项设置为更高值(例如 2.0)以提高吞吐量并增加远程服务器的负载。较低的 AUTOTHROTTLE_TARGET_CONCURRENCY 值(例如 0.5)会使爬虫更保守和友好。

请注意,启用 AutoThrottle 扩展时,CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP 选项仍然有效。这意味着如果 AUTOTHROTTLE_TARGET_CONCURRENCY 设置的值高于 CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP,爬虫将无法达到此并发 Request 数。

在任何给定时间点,Scrapy 发送的并发 Request 数可能多于或少于 AUTOTHROTTLE_TARGET_CONCURRENCY;这是一个爬虫试图接近的建议值,而不是硬性限制。

AUTOTHROTTLE_DEBUG

默认值: False

启用 AutoThrottle 调试模式,该模式将显示收到的每个 Response 的统计信息,以便您可以实时查看节流参数如何调整。