自动限速扩展

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

设计目标

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

  2. 自动将 Scrapy 调整到最佳爬取速度,这样用户就不必调整下载延迟来找到最佳速度。用户只需要指定它允许的最大并发请求数,扩展程序会完成其余工作。

工作原理

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

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

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

无需调整延迟,只需设置一个小的固定下载延迟并使用 CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP 选项对并发性进行硬限制。它将提供类似的效果,但有一些重要的区别

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

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

自动限速不会出现这些问题。

限速算法

自动限速算法根据以下规则调整下载延迟

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

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

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

  4. 不允许非 200 响应的延迟降低延迟;

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

注意

自动限速扩展遵守并发和延迟的标准 Scrapy 设置。这意味着它将尊重 CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP 选项,并且永远不会将下载延迟设置为低于 DOWNLOAD_DELAY

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

请注意,在协作式多任务环境中,很难准确地测量这些延迟,因为例如,Scrapy 可能忙于处理爬虫回调,并且无法处理下载。但是,这些延迟仍然应该提供对 Scrapy(最终是服务器)有多忙的合理估计,并且此扩展基于此前提。

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

自动限速根据属于该下载时隙的响应的延迟调整下载时隙的延迟。唯一的例外是非 200 响应,这些响应仅被考虑以增加延迟,但如果它们会降低延迟则会被忽略。

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

from scrapy import Request

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

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

设置

用于控制自动限速扩展的设置是

有关更多信息,请参阅 工作原理

AUTOTHROTTLE_ENABLED

默认值:False

启用自动限速扩展。

AUTOTHROTTLE_START_DELAY

默认值:5.0

初始下载延迟(以秒为单位)。

AUTOTHROTTLE_MAX_DELAY

默认值:60.0

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

AUTOTHROTTLE_TARGET_CONCURRENCY

默认值:1.0

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

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

请注意,启用自动限速扩展时,仍然会尊重 CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP 选项。这意味着如果 AUTOTHROTTLE_TARGET_CONCURRENCY 设置为高于 CONCURRENT_REQUESTS_PER_DOMAINCONCURRENT_REQUESTS_PER_IP 的值,则爬虫将无法达到此并发请求数。

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

AUTOTHROTTLE_DEBUG

默认值:False

启用自动限速调试模式,它将在接收到的每个响应上显示统计信息,以便您可以实时查看限速参数是如何调整的。