在進行大規模網路爬蟲的時候,經常會遇到爬了一會突然丟擲乙個錯誤來,然後整個程式就停止了執行。而我們在處於學習爬蟲初期的同胞,比如我,一旦出現程式錯誤停止,就不知道如何在修改程式後接著剛剛爬取的位置繼續爬取。就算是我們做了比較好的日誌輸出,知道是再爬取到哪一頁時出現問題,但也不得不在這一頁或者這一頁的前一頁重新開始,然後繼續爬蟲。雖說不是很麻煩,但自己的程式走一半突然停掉了,就好像吃的冰棒吃的好好的突然掉地上,雖然衝衝會變乾淨,但總覺得它已經不那麼美好了。哈哈~
因此在設計爬蟲時,做好程式的異常處理還是很重要的。這樣當遇到異常時,程式將它捕捉到,並且按照咱們自己的設計輸出相應的提醒 。接著程式自己再繼續往前走,不會說是一遇到異常,一下子爬到地上裝死。那就很尷尬了
現在我們爬取網頁,比較簡單常用的是requests庫,一般出現異常的地方也就是requests.get(url)時出現的。而在此處出現的異常一般有兩種。
1、網頁在伺服器上不存在或者獲取網頁時出現錯誤(http異常)
2、伺服器不存在
也有人說是三種,就是本地網路有問題。不過這種就沒必要做異常處理了,畢竟一旦出現本地網路有問題,捕捉跟不捕捉結果沒什麼區別,都是程式裝死。
所以主要還是總結一下前兩種的異常處理。
首先第一種。發生第一種異常時,程式會返回http錯誤。我們做異常處理時可以:
程式正常處理
try、except、else,指的是用try去試探請求,如果請求**捉則輸出except要輸出的內容,else將不再執行,如果不是except
裡的異常,則程式去執行else裡的內容。
正常處理
以上就是正常的異常處理的步驟。
但在正常的小規模爬取過程中,一般出現異常的也就是幾個比較不識好歹的頁面,如果覺得異常捕捉太繁瑣。我們可以偷個懶,先簡單處理之後再去親自去面談一下那些異常的頁面到底是什麼情況。
比如:正常來說我們都是狀態碼為200時,才能得到包含我們資料的response。
因此我們可以:
response = requests.get(url)
if response.status_code == 200:
正常處理
else :
contine
此時我們也可以建立乙個列表,當出現else時將它的response.url新增到列表中,最後輸出列表。以檢視哪些頁面出現了問題,或者直接每當遇到問題直接print出來它的鏈結也可以。
當然前提是出現問題的url頁面比較少時使用,正常來說我們還是用最開始說的兩種異常處理方式比較正規一點。
ps:小胖胖的豬崽
網路爬蟲處理異常的種類
每個程式都不可避免地要進行異常處理,爬蟲也不例外,假如不進行異常處理,可能導致爬蟲程式直接崩掉。以下是網路爬蟲出現的異常種類。urlerror 通常,urlerror在沒有網路連線 沒有路由到特定伺服器 或者伺服器不存在的情況下產生。首先我們要明白伺服器上每乙個http 應答物件response都包...
爬蟲異常處理
狀態碼 含義200 成功 成功 伺服器已成功處理了請求。通常,這表示伺服器提供了請求的網頁 301 永久移動 請求的網頁已永久移動到新位置。伺服器返回此響應 對 get 或 head 請求的響 應 時,會自動將請求者轉到新位置。302 臨時移動 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用...
爬蟲異常處理
在這個模組中 urllib.error urlerror httperror都是異常處理類,為了讓 更加的健壯 exception 官方的異常基類,所有的異常類都是直接或者間接的繼承這個類 urlerror 如果斷網或者主機不存在 httperror 請求的資源不存在,比如404 urlerror可...