如何使用開源webmagic框架,進行定向的爬蟲重試機制

如何使用開源webmagic框架,進行定向的爬蟲重試機制

項目中使用webmagic作為爬蟲爬取框架,需要實現2個功能:

  • 對於一些未爬取到的URL,需要做重試機制,重複爬取,設置爬取次數,直至爬取到網頁內容或者達到重試次數。
  • 用戶點擊停止,則停止對剩餘URL的爬取。

這二個功能的添加都是對scheduler模塊進行改造,webmagic的scheduler模塊負責管理待抓取的URL,以及一些去重的工作。WebMagic默認提供了JDK的內存隊列來管理URL,並用集合來進行去重。此為實現的前提。

重試

由於使用過的是webmagic框架,框架中的pageprocessor模塊自帶方法page.addTargetRequest()來將URL添加到隊列尾,前期在使用時,直接將未爬取成功的URL添加進去,發現程序並未對該URL進行重試,研究源碼後,發現他的實現是:

如何使用開源webmagic框架,進行定向的爬蟲重試機制

在往隊列中push元素時,會進行一次隊列中是否有重複數據的判斷,若有重複數據便不添加到隊列中,因此,我們重寫了scheduler:

如何使用開源webmagic框架,進行定向的爬蟲重試機制

停止

既然基於webmagic框架,則考慮對框架內使用的方法進行二次開發,原以為調用page.getTargetRequests().clear()方法,將所有剩餘的request隊列清空,即可達到停止的目的,後再項目上線後,運行幾天,發現出現用戶點擊停止仍舊爬取的情況。

前面提到,scheduler模塊使用JD內存隊列管理URL。經過研究webmagic源碼發現,程序在爬取下一個URL的時候,是從scheduler隊列中直接push一個元素出來,而我的操作並沒有對scheduler進行修改。所以重寫了一下scheduler,添加一個方法:

如何使用開源webmagic框架,進行定向的爬蟲重試機制

之後在Spider(WebMagic操作的入口)啟動時,前一個URL爬取成功進行Pipeline操作時,調用scheduler的clear方法,進行清空操作:

如何使用開源webmagic框架,進行定向的爬蟲重試機制

在Spider啟動類的方法裡面添加一個判斷,其餘不做修改,即可達到目的。


分享到:


相關文章: