1. 程式人生 > >scrapy配置爬蟲關閉的條件

scrapy配置爬蟲關閉的條件

在scrapy的預設配置檔案中看到這四個配置:

CLOSESPIDER_TIMEOUT = 0
CLOSESPIDER_PAGECOUNT = 0
CLOSESPIDER_ITEMCOUNT = 0
CLOSESPIDER_ERRORCOUNT = 0

這四個配置是配置爬蟲自動關閉條件的,等於0代表不開啟。

CLOSESPIDER_TIMEOUT

預設值: 0

一個整數值,單位為秒。如果一個spider在指定的秒數後仍在執行, 它將以 closespider_timeout 的原因被自動關閉。 如果值設定為0(或者沒有設定),spiders不會因為超時而關閉。

CLOSESPIDER_ITEMCOUNT

預設值: 0

一個整數值,指定條目的個數。如果spider爬取條目數超過了指定的數, 並且這些條目通過item pipeline傳遞,spider將會以 closespider_itemcount 的原因被自動關閉。

CLOSESPIDER_PAGECOUNT

預設值: 0

一個整數值,指定最大的抓取響應(reponses)數。 如果spider抓取數超過指定的值,則會以 closespider_pagecount 的原因自動關閉。 如果設定為0(或者未設定),spiders不會因為抓取的響應數而關閉。

CLOSESPIDER_ERRORCOUNT

預設值: 0

一個整數值,指定spider可以接受的最大錯誤數。 如果spider生成多於該數目的錯誤,它將以 closespider_errorcount

 的原因關閉。 如果設定為0(或者未設定),spiders不會因為發生錯誤過多而關閉。

但是,這裡存在一個問題,比如:配置CLOSESPIDER_ERRORCOUNT,在實際執行時發現。在併發較高或者任務較多的情況下。在raise之後還會處理相當長一段時間的任務才會退出。這是怎麼回事呢?

還記得settings.py中的CONCURRENT_REQUESTS = 16配置嗎?
姑且當作是16個併發一起執行,當其中一個協程丟擲異常(CloseSpider('強制停止')),他只會把自己給停止。所以要等到其他十五個協程都丟擲異常之後整個爬蟲才能退出。

另一種理解:當其中一個request或者response丟擲異常(CloseSpider('強制停止')),他關閉的是scrapy框架中的引擎,排程器的任務佇列還有15個request沒有處理掉,之後會繼續處理剩下的request物件,然後才結束爬取資料。

所以,如果你需要在關閉爬蟲的時候也儲存對應的爬取進度,即儲存已經爬取過的url,就會遇到這樣一個問題,你想在丟擲一定數量的異常後自動關閉爬蟲並且儲存爬取進度,但丟擲一定的異常後還是會繼續爬取資料,沒有立刻停下來,他還會爬取剩下沒有請求的url,沒有完成的請求url被儲存到xxx:dupefilter去重佇列中去了。所以自動關閉之後的url都不再會被請求了,這時儲存下來的爬取進度是不準確的。