AutoThrottle扩展¶
这是根据Scrapy服务器和您正在抓取的网站的负载自动限制抓取速度的扩展程序。
设计目标¶
更好的网站,而不是使用默认下载延迟零
自动将刮擦调整到最佳抓取速度,因此用户不必调整下载延迟以找到最佳抓取速度。用户只需要指定它允许的最大并发请求,并且扩展完成其余部分。
怎么运行的¶
AutoThrottle扩展动态地调整下载延迟,使蜘蛛发送 AUTOTHROTTLE_TARGET_CONCURRENCY
并发请求平均到每个远程网站。
它使用下载延迟来计算延迟。主要想法如下:如果服务器需要 latency
秒来响应,客户端应该每个 latency/N
秒发送一个请求,以并行处理 N
请求。
而不是调整延迟,可以只设置一个小的固定下载延迟,并强加硬限制并发使用 CONCURRENT_REQUESTS_PER_DOMAIN
或 CONCURRENT_REQUESTS_PER_IP
选项。它会提供类似的效果,但有一些重要的区别:
因为下载延迟很小,会有偶然的请求突发;
通常非200(错误)响应可以比常规响应更快地返回,因此具有小的下载延迟和硬并发限制搜寻器将在服务器开始返回错误时更快地向服务器发送请求。但这是与爬虫应该做的相反 - 在错误的情况下,减慢速度更有意义:这些错误可能是由高请求率引起的。
AutoThrottle没有这些问题。
调节算法¶
AutoThrottle算法根据以下规则调整下载延迟:
蜘蛛总是从
AUTOTHROTTLE_START_DELAY
的下载延迟开始;当接收到响应时,目标下载延迟被计算为
latency / N
,其中latency
是响应的等待时间,N
是AUTOTHROTTLE_TARGET_CONCURRENCY
。下一次请求的下载延迟被设置为先前下载延迟和目标下载延迟的平均值;
不允许非200响应的延迟减少延迟;
下载延迟不能小于
DOWNLOAD_DELAY
或大于AUTOTHROTTLE_MAX_DELAY
注解
AutoThrottle扩展符合标准Scrapy设置的并发和延迟。这意味着它将尊重 CONCURRENT_REQUESTS_PER_DOMAIN
和 CONCURRENT_REQUESTS_PER_IP
选项,并且从不设置低于 DOWNLOAD_DELAY
的下载延迟。
在Scrapy中,下载延迟测量为在建立TCP连接和接收HTTP头之间经过的时间。
注意,在协作多任务环境中,这些延迟很难准确测量,因为Scrapy可能忙于处理蜘蛛回调,并且无法参加下载。然而,这些延迟应该仍然给出Scrapy(以及最终的服务器)有多忙的合理估计,并且这个扩展建立在这个前提上。
设置¶
用于控制AutoThrottle扩展的设置有:
有关更多信息,请参阅 怎么运行的。
AUTOTHROTTLE_TARGET_CONCURRENCY¶
1.1 新版功能.
默认值:1.0
Scrapy应该与远程网站并行发送的平均请求数。
默认情况下,AutoThrottle会调整延迟,以向每个远程网站发送单个并发请求。将此选项设置为更高的值(例如 2.0
),以提高远程服务器上的吞吐量和负载。较低的 AUTOTHROTTLE_TARGET_CONCURRENCY
值(例如,0.5
)使搜寻器更保守和有礼貌。
请注意,当启用AutoThrottle扩展时,CONCURRENT_REQUESTS_PER_DOMAIN
和 CONCURRENT_REQUESTS_PER_IP
选项仍然受到尊重。这意味着如果 AUTOTHROTTLE_TARGET_CONCURRENCY
设置为高于 CONCURRENT_REQUESTS_PER_DOMAIN
或 CONCURRENT_REQUESTS_PER_IP
的值,则搜寻器将不会达到此并发请求数。
在每个给定的时间点,Scrapy可以发送比 AUTOTHROTTLE_TARGET_CONCURRENCY
更多或更少的并发请求;它是抓取工具尝试接近的建议值,而不是硬限制。