AutoThrottle 扩展

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

设计目标

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

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

工作原理

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

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

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

我们可以不调整延迟,而是使用 CONCURRENT_REQUESTS_PER_DOMAIN 设置一个小的固定下载延迟并施加硬性并发限制。它会产生类似的效果,但存在一些重要的差异

  • 因为下载延迟较小,会偶尔出现请求突发;

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

AutoThrottle 没有这些问题。

节流算法

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

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

  2. 收到响应时,目标下载延迟计算为 latency / N,其中 latency 是响应的延迟,NAUTOTHROTTLE_TARGET_CONCURRENCY

  3. 后续请求的下载延迟设置为前一个下载延迟和目标下载延迟的平均值;

  4. 非 200 响应的延迟不允许减少下载延迟;

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

注意

AutoThrottle 扩展遵守 Scrapy 标准的并发和延迟设置。这意味着它将尊重 CONCURRENT_REQUESTS_PER_DOMAIN,并且绝不会将下载延迟设置得低于 DOWNLOAD_DELAY

在 Scrapy 中,下载延迟是测量从建立 TCP 连接到接收 HTTP 头部之间的时间。

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

阻止特定请求触发槽延迟调整

在 2.12.0 版本中添加。

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

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

from scrapy import Request

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

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

设置

控制 AutoThrottle 扩展的设置包括

更多信息请参阅 工作原理

AUTOTHROTTLE_ENABLED

默认值:False

启用 AutoThrottle 扩展。

AUTOTHROTTLE_START_DELAY

默认值: 5.0

初始下载延迟(秒)。

AUTOTHROTTLE_MAX_DELAY

默认值: 60.0

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

AUTOTHROTTLE_TARGET_CONCURRENCY

默认值: 1.0

Scrapy 应并行发送到远程网站的平均请求数。它必须大于 0.0

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

请注意,当启用 AutoThrottle 扩展时,CONCURRENT_REQUESTS_PER_DOMAIN 仍然受到尊重。这意味着如果 AUTOTHROTTLE_TARGET_CONCURRENCY 设置的值高于 CONCURRENT_REQUESTS_PER_DOMAIN,爬虫将无法达到此并发请求数。

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

AUTOTHROTTLE_DEBUG

默认值:False

启用 AutoThrottle 调试模式,它将显示每个收到的响应的统计信息,这样您就可以实时查看节流参数是如何调整的。