2014-12-03 45 views
1

我知道一個恆定的延遲可以是否可以在scrapy中設置動態下載延遲?

settings.py 
DOWNLOAD_DELAY = 2 

設置但是,如果我延遲設置爲2秒它是沒有效率不夠。如果我將DOWNLOAD_DELAY設置爲0.

爬蟲能夠抓取大約10個頁面。在那之後,目標頁面會返回類似「你太頻繁請求」的內容。

我想要做的是保持download_delay爲0.一旦在HTML中發現「請求太頻繁」的味精。它將延遲更改爲2秒。一段時間後,它切換回零。

有沒有任何模塊可以做到這一點?或者其他更好的想法來處理這種情況?

更新: 我發現這是一個擴展調用AutoThrottle 但它是否能夠自定義這樣的邏輯?

if (requesting too frequently) is found 
    increase the DOWNLOAD_DELAY 
+0

正是Autothrottle所做的;你也可以設置其限制。 – nramirezuy 2014-12-03 18:01:42

回答

-2

是的,您可以使用時間模塊來設置動態延遲。

import time 

for i in range(10): 
    *** Operations 1**** 
    time.sleep(i) 
    *** Operations 2**** 

現在你可以看到操作1和操作之間的延遲2

注:

變量「i」是在幾秒鐘的形式。

+1

睡眠不適用於scrapy,它使用asyc api構建而成。 – nramirezuy 2014-12-03 18:03:07

0

如果在獲得反蜘蛛頁面之後,在2秒內可以獲得數據頁面,那麼您所要求的可能需要編寫一個檢查反蜘蛛頁面的下載中間件 ,將所有預定請求重置爲更新隊列,當蜘蛛空閒以便從更新隊列中獲得請求時,啓動一個循環呼叫(循環間隔是你新的下載延遲的破解),並且嘗試確定下載延遲何時不再需要(需要一些測試),然後停止循環並將所有請求重新安排到scrapy調度程序的更新隊列中。分佈式抓取時,您需要使用redis隊列。

將下載延遲設置爲0,根據我的經驗,吞吐量可以輕鬆超過1000件/分鐘。如果在10次響應後彈出反蜘蛛頁面,則不值得付出努力。

取而代之,也許你可以試着找出你的目標服務器允許的速度有多快,可能是1.5s,1s,0.7s,0.5s等等。然後可能重新設計你的產品考慮到你的爬蟲的吞吐量。

0

您現在可以使用Auto Throttle extension。它默認關閉。您可以在項目的settings.py文件中添加這些參數以啓用它。

AUTOTHROTTLE_ENABLED = True 
# The initial download delay 
AUTOTHROTTLE_START_DELAY = 5 
# The maximum download delay to be set in case of high latencies 
AUTOTHROTTLE_MAX_DELAY = 300 
# The average number of requests Scrapy should be sending in parallel to 
# each remote server 
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0 
# Enable showing throttling stats for every response received: 
AUTOTHROTTLE_DEBUG = True 
相關問題