您好,登錄后才能下訂單哦!
這篇文章主要介紹Python3爬蟲中處理異常的方法是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
前一節我們了解了請求的發送過程,但是在網絡不好的情況下,如果出現了異常,該怎么辦呢?這時如果不處理這些異常,程序很可能因報錯而終止運行,所以異常處理還是十分有必要的。
urllib的error模塊定義了由request模塊產生的異常。如果出現了問題,request模塊便會拋出error模塊中定義的異常。
1. URLError
URLError類來自urllib庫的error模塊,它繼承自OSError類,是error異常模塊的基類,由request模塊生的異常都可以通過捕獲這個類來處理。
它具有一個屬性reason,即返回錯誤的原因。
下面用一個實例來看一下:
from urllib import request, error try: response = request.urlopen('http://cuiqingcai.com/index.htm') except error.URLError as e: print(e.reason)
我們打開一個不存在的頁面,照理來說應該會報錯,但是這時我們捕獲了URLError這個異常,運行結果如下:
Not Found
程序沒有直接報錯,而是輸出了如上內容,這樣通過如上操作,我們就可以避免程序異常終止,同時異常得到了有效處理。
2. HTTPError
它是URLError的子類,專門用來處理HTTP請求錯誤,比如認證請求失敗等。它有如下3個屬性。
code:返回HTTP狀態碼,比如404表示網頁不存在,500表示服務器內部錯誤等。
reason:同父類一樣,用于返回錯誤的原因。
headers:返回請求頭。
下面我們用幾個實例來看看:
from urllib import request,error try: response = request.urlopen('http://cuiqingcai.com/index.htm') except error.HTTPError as e: print(e.reason, e.code, e.headers, sep='\n')
運行結果如下:
Not Found 404 Server: nginx/1.4.6 (Ubuntu) Date: Wed, 03 Aug 2016 08:54:22 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close X-Powered-By: PHP/5.5.9-1ubuntu4.14 Vary: Cookie Expires: Wed, 11 Jan 1984 05:00:00 GMT Cache-Control: no-cache, must-revalidate, max-age=0 Pragma: no-cache Link: <http://cuiqingcai.com/wp-json/>; rel="https://api.w.org/"
依然是同樣的網址,這里捕獲了HTTPError異常,輸出了reason、code和headers屬性。
因為URLError是HTTPError的父類,所以可以先選擇捕獲子類的錯誤,再去捕獲父類的錯誤,所以上述代碼更好的寫法如下:
from urllib import request, error try: response = request.urlopen('http://cuiqingcai.com/index.htm') except error.HTTPError as e: print(e.reason, e.code, e.headers, sep='\n') except error.URLError as e: print(e.reason) else: print('Request Successfully')
這樣就可以做到先捕獲HTTPError,獲取它的錯誤狀態碼、原因、headers等信息。如果不是HTTPError異常,就會捕獲URLError異常,輸出錯誤原因。最后,用else來處理正常的邏輯。這是一個較好的異常處理寫法。
有時候,reason屬性返回的不一定是字符串,也可能是一個對象。再看下面的實例:
import socket import urllib.request import urllib.error try: response = urllib.request.urlopen('https://www.baidu.com', timeout=0.01) except urllib.error.URLError as e: print(type(e.reason)) if isinstance(e.reason, socket.timeout): print('TIME OUT')
這里我們直接設置超時時間來強制拋出timeout異常。
運行結果如下:
<class 'socket.timeout'> TIME OUT
可以發現,reason屬性的結果是socket.timeout類。所以,這里我們可以用isinstance()方法來判斷它的類型,作出更詳細的異常判斷。
以上是Python3爬蟲中處理異常的方法是什么的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。