scrapy 2.3 AutoThrottle擴(kuò)展

2021-06-17 16:13 更新

這是一個(gè)擴(kuò)展,基于Scrapy服務(wù)器和您正在爬行的網(wǎng)站的負(fù)載,自動(dòng)限制爬行速度。

設(shè)計(jì)目標(biāo)

  1. 對(duì)站點(diǎn)更好,而不是使用默認(rèn)的下載延遲為零
  2. 自動(dòng)調(diào)整Scrapy到最佳的爬行速度,因此用戶不必調(diào)整下載延遲來(lái)找到最佳的。用戶只需要指定它允許的最大并發(fā)請(qǐng)求,其余的由擴(kuò)展來(lái)完成。

它是如何工作的

AutoThrottle 擴(kuò)展動(dòng)態(tài)調(diào)整下載延遲,使蜘蛛發(fā)送 ?AUTOTHROTTLE_TARGET_CONCURRENCY? 平均每個(gè)遠(yuǎn)程網(wǎng)站的并發(fā)請(qǐng)求。

它使用下載延遲來(lái)計(jì)算延遲。主要思想如下:如果服務(wù)器需要 ?latency? 響應(yīng)時(shí)間為秒,客戶端應(yīng)每秒鐘發(fā)送一個(gè)請(qǐng)求 ?latency/N? 秒有 ?N? 并行處理的請(qǐng)求。

不需要調(diào)整延遲,只需設(shè)置一個(gè)小的固定下載延遲,并對(duì)使用 ?CONCURRENT_REQUESTS_PER_DOMAIN? 或 ?CONCURRENT_REQUESTS_PER_IP? 選項(xiàng)。它會(huì)產(chǎn)生類似的效果,但有一些重要的區(qū)別:

  • 因?yàn)橄螺d延遲很小,偶爾會(huì)有突發(fā)的請(qǐng)求;
  • 通常,非200(錯(cuò)誤)響應(yīng)的返回速度比常規(guī)響應(yīng)快,因此,只要有一個(gè)較小的下載延遲和硬并發(fā)限制,當(dāng)服務(wù)器開始返回錯(cuò)誤時(shí),爬蟲程序?qū)⒏斓叵蚍?wù)器發(fā)送請(qǐng)求。但這與爬蟲應(yīng)該做的相反——如果出現(xiàn)錯(cuò)誤,放慢速度更有意義:這些錯(cuò)誤可能是由高請(qǐng)求率引起的。

AutoThrottle 沒有這些問題。

節(jié)流算法

AutoThrottle 算法根據(jù)以下規(guī)則調(diào)整下載延遲:

  1. 蜘蛛總是以下載延遲開始 ?AUTOTHROTTLE_START_DELAY? ;
  2. 當(dāng)收到響應(yīng)時(shí),目標(biāo)下載延遲計(jì)算為 ?latency / N? 在哪里? ?latency? 是響應(yīng)的延遲,并且 ?N? 是 ?AUTOTHROTTLE_TARGET_CONCURRENCY? .
  3. 下一個(gè)請(qǐng)求的下載延遲設(shè)置為上一個(gè)下載延遲和目標(biāo)下載延遲的平均值;
  4. 不允許非200響應(yīng)的延遲減少延遲;
  5. 下載延遲不能小于 ?DOWNLOAD_DELAY? 或大于 ?AUTOTHROTTLE_MAX_DELAY?

注解

autothrottle擴(kuò)展支持并發(fā)和延遲的標(biāo)準(zhǔn) Scrapy 設(shè)置。這意味著它將尊重 ?CONCURRENT_REQUESTS_PER_DOMAIN? 和 ?CONCURRENT_REQUESTS_PER_IP? 選項(xiàng),并且從不將下載延遲設(shè)置為低于  ?DOWNLOAD_DELAY? .

在scrappy中,下載延遲是以建立TCP連接和接收HTTP頭之間所經(jīng)過的時(shí)間來(lái)度量的。

注意,在一個(gè)合作的多任務(wù)環(huán)境中,這些延遲很難精確測(cè)量,因?yàn)閟crapy可能正忙于處理spider回調(diào),例如,無(wú)法參加下載。然而,這些延遲仍然應(yīng)該對(duì)Scrapy(最終是服務(wù)器)有多忙給出一個(gè)合理的估計(jì),并且這個(gè)擴(kuò)展是在這個(gè)前提下構(gòu)建的。

設(shè)置

用于控制 AutoThrottle 擴(kuò)展的設(shè)置為:

  • ?AUTOTHROTTLE_ENABLED?
  • ?AUTOTHROTTLE_START_DELAY?
  • ?AUTOTHROTTLE_MAX_DELAY?
  • ?AUTOTHROTTLE_TARGET_CONCURRENCY?
  • ?AUTOTHROTTLE_DEBUG?
  • ?CONCURRENT_REQUESTS_PER_DOMAIN?
  • ?CONCURRENT_REQUESTS_PER_IP?
  • ?DOWNLOAD_DELAY?

有關(guān)詳細(xì)信息,請(qǐng)參閱 它是如何工作的 .

AUTOTHROTTLE_ENABLED

違約: ?False?

啟用AutoThrottle 擴(kuò)展。

AUTOTHROTTLE_START_DELAY

違約: ?5.0?

初始下載延遲(秒)。

AUTOTHROTTLE_MAX_DELAY

違約: ?60.0?

在高延遲情況下設(shè)置的最大下載延遲(秒)。

AUTOTHROTTLE_TARGET_CONCURRENCY

違約: ?1.0?

Scrapy的平均請(qǐng)求數(shù)應(yīng)與遠(yuǎn)程網(wǎng)站并行發(fā)送。

默認(rèn)情況下,autothrottle會(huì)調(diào)整延遲以向每個(gè)遠(yuǎn)程網(wǎng)站發(fā)送單個(gè)并發(fā)請(qǐng)求。將此選項(xiàng)設(shè)置為更高的值(例如 ?2.0? )以增加遠(yuǎn)程服務(wù)器的吞吐量和負(fù)載。下層 ?AUTOTHROTTLE_TARGET_CONCURRENCY? 價(jià)值(例如) ?0.5? )讓爬蟲人更加保守和禮貌。

注意 ?CONCURRENT_REQUESTS_PER_DOMAIN? 和 ?CONCURRENT_REQUESTS_PER_IP? 啟用 AutoThrottle 擴(kuò)展功能時(shí),仍會(huì)遵循選項(xiàng)。這意味著如果 ?AUTOTHROTTLE_TARGET_CONCURRENCY? 設(shè)置為大于的值 ?CONCURRENT_REQUESTS_PER_DOMAIN? 或 ?CONCURRENT_REQUESTS_PER_IP? ,爬蟲程序?qū)o(wú)法達(dá)到此數(shù)量的并發(fā)請(qǐng)求。

在每個(gè)給定的時(shí)間點(diǎn)上,scrapy可以發(fā)送的并發(fā)請(qǐng)求多于或少于 ?AUTOTHROTTLE_TARGET_CONCURRENCY? ;這是爬蟲嘗試接近的建議值,而不是硬限制。

AUTOTHROTTLE_DEBUG

違約: ?False?

啟用 AutoThrottle 調(diào)試模式,該模式將顯示收到的每個(gè)響應(yīng)的統(tǒng)計(jì)信息,以便您可以看到如何實(shí)時(shí)調(diào)整節(jié)流參數(shù)。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)