网络爬虫异常处理总结
? ? 在進行大規模網絡爬蟲的時候,經常會遇到爬了一會突然拋出一個錯誤來,然后整個程序就停止了運行。而我們在處于學習爬蟲初期的同胞,比如我,一旦出現程序錯誤停止,就不知道如何在修改程序后接著剛剛爬取的位置繼續爬取。就算是我們做了比較好的日志輸出,知道是再爬取到哪一頁時出現問題,但也不得不在這一頁或者這一頁的前一頁重新開始,然后繼續爬蟲。雖說不是很麻煩,但自己的程序走一半突然停掉了,就好像吃的冰棒吃的好好的突然掉地上,雖然沖沖會變干凈,但總覺得它已經不那么美好了。哈哈~? ??
? ? ?因此在設計爬蟲時,做好程序的異常處理還是很重要的。這樣當遇到異常時,程序將它捕捉到,并且按照咱們自己的設計輸出相應的提醒 。接著程序自己再繼續往前走,不會說是一遇到異常,一下子爬到地上裝死。那就很尷尬了
? ?? 現在我們爬取網頁,比較簡單常用的是requests庫,一般出現異常的地方也就是requests.get(url)時出現的。而在此處出現的異常一般有兩種。
1、網頁在服務器上不存在或者獲取網頁時出現錯誤(HTTP異常)
2、服務器不存在
也有人說是三種,就是本地網絡有問題。不過這種就沒必要做異常處理了,畢竟一旦出現本地網路有問題,捕捉跟不捕捉結果沒什么區別,都是程序裝死。
所以主要還是總結一下前兩種的異常處理。
首先第一種。發生第一種異常時,程序會返回HTTP錯誤。我們做異常處理時可以:
from? ? urllib.error? ? ?import? ? ?HttpError
try:
? ? ?response = requests.get(url)
except HttpError as e:
? ? ?print(e)
else:
? ? ?程序正常處理? ? ? ? ?
try、except、else,指的是用try去試探請求,如果請求被捕捉則輸出except要輸出的內容,else將不再執行,如果不是except
里的異常,則程序去執行else里的內容。
如果不是HTTP異常,而是服務器不存在,或者URL鏈接錯誤,則程序會返回URLError,此時異常處理可以在捕捉HTTP基礎上再加一條:
from? ? ?urllib.error? ? ?import? ? URLError
try:
? ? ?response = requests.get(url)
except HttpError as e:
? ? ?print(e)
excepu URLErroe as e:
? ? ?print('The Server could? not be found')
else:
? ? 正常處理? ? ? ? ? ? ?
以上就是正常的異常處理的步驟。
但在正常的小規模爬取過程中,一般出現異常的也就是幾個比較不識好歹的頁面,如果覺得異常捕捉太繁瑣。我們可以偷個懶,先簡單處理之后再去親自去面談一下那些異常的頁面到底是什么情況。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
比如:正常來說我們都是狀態碼為200時,才能得到包含我們數據的response。
因此我們可以:
response = requests.get(url)
if? ? response.status_code? ==? 200:
? ? ? ?正常處理
else? :
? ? ? contine
此時我們也可以創建一個列表,當出現else時將它的response.url添加到列表中,最后輸出列表。以查看哪些頁面出現了問題,或者直接每當遇到問題直接print出來它的鏈接也可以。
當然前提是出現問題的url頁面比較少時使用,正常來說我們還是用最開始說的兩種異常處理方式比較正規一點。
?
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?PS:小胖胖的豬崽
總結
以上是生活随笔為你收集整理的网络爬虫异常处理总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Mybatis在Maven中的应用技巧
- 下一篇: ubuntu下OpenAI Box2d