python 高度健壯性爬蟲的異常和超時問題

路易十四發表於2017-02-13

爬蟲這型別程式典型特徵是意外多,無法確保每次請求都是穩定的返回統一的結果,要提高健壯性,能對錯誤資料or超時or程式死鎖等都能進行處理,才能確保程式幾個月不停止。本專案乃長期維護github:反反爬蟲開源庫中積累下來,更多幹貨歡迎star。

目錄:

  • 一:基礎try&except異常處理
  • 二:普通請求函式的超時處理
  • 三:selenium+chrome  | phantomjs 的超時處理
  • 四:自定義函式的死鎖or超時處理
  • 五:自定義執行緒的死鎖or超時處理
  • 六:自重啟的程式設計

一:基礎try&except異常處理

try&except的語句作用不僅僅是要讓其捕獲異常更重要的是讓其忽略異常,因為爬蟲中的絕大多數異常可能重新請求就不存在,因此,發現異常的時候將其任務佇列進行修復其實是個最省力的好辦法。

其次被try包住的語句即使出錯也不會導致整個程式的退出,相信我,你絕對不希望計劃跑一個週末的程式在半夜停止了。

二:請求函式的超時處理

2.1:普通請求:

2.1.1單請求型別:

2.1.2會話保持型別:

三:selenium+chrome  | phantomjs 的超時處理

2.2.1:selenium+chrome的超時設定

官網原文:http://selenium-python.readthedocs.io/waits.html

顯式等待:、等待某個條件發生,然後再繼續進行程式碼。

隱式等待:是告訴WebDriver在嘗試查詢一個或多個元素(如果它們不是立即可用的)時輪詢DOM一定時間。預設設定為0,一旦設定,將為WebDriver物件例項的生命期設定隱式等待。

2.2.2:phantomjs的超時設定

這裡使用不帶selenium的phantomjs,需要使用js。主要設定語句是

四:自定義函式的死鎖or超時處理

這個非常重要!!

python是順序執行的,但是如果下一句話可能導致死鎖(比如一個while(1))那麼如何強制讓他超時呢?他本身如果沒有帶有超時設定的話,就要自己執行訊號(import signal)來處理

五:自定義執行緒的死鎖or超時處理

在某個程式中一方面不適合使用selenium+phantomjs的方式(要實現的功能比較難不適合)因為只能用原生的phantomjs,但是這個問題他本身在極端情況下也有可能停止(在超時設定之前因為某些錯誤)

那麼最佳方案就是用python單獨開一個執行緒(程式)呼叫原生phantomjs,然後對這個執行緒程式進行超時控制。

這裡用ping這個命令先做測試,

六:自重啟的程式設計

比如程式在某種情況下報錯多次,,那麼滿足條件後,讓其重啟即可解決大多數問題,當然這只不過是治標不治本而已,如果這個程式重啟沒有大問題(例如讀佇列型別)那麼自重啟這是最省力的方式之一。

打賞支援我寫出更多好文章,謝謝!

打賞作者

打賞支援我寫出更多好文章,謝謝!

python 高度健壯性爬蟲的異常和超時問題

相關文章