AutoThrottle扩展

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

设计目标

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

  2. 自动调整Scrapy到最佳爬取速度,因此用户无需调整下载延迟以找到最佳值。用户只需指定允许的最大并发请求数,扩展程序将完成其余工作。

它是如何工作的

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

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

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

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

  • 因为下载延迟很小,所以偶尔会有请求的突发。

  • 通常非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_DOMAINCONCURRENT_REQUESTS_PER_IP 选项,并且 永远不会将下载延迟设置为低于 DOWNLOAD_DELAY

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

请注意,这些延迟在协作式多任务环境中很难准确测量,因为Scrapy可能正忙于处理蜘蛛回调,例如,无法处理下载。然而,这些延迟仍然应该给出Scrapy(以及最终,服务器)有多忙的合理估计,而这个扩展就是基于这个前提构建的。

防止特定请求触发时隙延迟调整

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_DOMAINCONCURRENT_REQUESTS_PER_IP选项仍然有效。这意味着如果 AUTOTHROTTLE_TARGET_CONCURRENCY设置为高于 CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP的值,爬虫将无法达到这个并发请求数。

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

AUTOTHROTTLE_DEBUG

默认值:False

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