爬蟲request模組異常處理
阿新 • • 發佈:2019-01-12
一 URLError
1 程式碼
''' URLError類來自urllib庫的error模組,它繼承自OSError類,是error異常模組的基類, 由request模組生的異常都可以通過捕獲URLError類來處理。 它具有一個屬性reason,即返回錯誤的原因。 ''' from urllib import request, error try: response = request.urlopen('http://cuiqingcai.com/index.htm') except error.URLError as e: print(e.reason)
2 執行結果
E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_2.py
Not Found
3 說明
程式沒有直接報錯,而是輸出瞭如上內容,這樣通過如上操作,我們就可以避免程式異常終止,同時異常得到了有效處理。
二 HTTPError
1 點睛
HTTPError是URLError的子類,專門用來處理HTTP請求錯誤,比如認證請求失敗等。它有如下3個屬性。
-
code:返回HTTP狀態碼,比如404表示網頁不存在,500表示伺服器內部錯誤等。
-
reason:同父類一樣,用於返回錯誤的原因。
-
headers:返回請求頭。
2 實戰一程式碼
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')
3 實戰一結果
3 實戰一結果
E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_2.py Not Found 404 Server: nginx/1.10.3 (Ubuntu) Date: Mon, 07 Jan 2019 13:32:06 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close Vary: Cookie Expires: Wed, 11 Jan 1984 05:00:00 GMT Cache-Control: no-cache, must-revalidate, max-age=0 Link: <https://cuiqingcai.com/wp-json/>; rel="https://api.w.org/"
4 實戰一說明
依然是同樣的網址,這裡捕獲了HTTPError異常,輸出了reason、code和headers屬性。
5 實戰二程式碼
'''
因為URLError是HTTPError的父類,所以可以先選擇捕獲子類的錯誤,再去捕獲父類的錯誤
這樣就可以做到先捕獲HTTPError,獲取它的錯誤狀態碼、原因、headers等資訊。
如果不是HTTPError異常,就會捕獲URLError異常,輸出錯誤原因。
最後,用else來處理正常的邏輯。這是一個較好的異常處理寫法。
'''
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')
6 實戰二執行結果
E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_2.py
Not Found
404
Server: nginx/1.10.3 (Ubuntu)
Date: Mon, 07 Jan 2019 13:36:21 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close
Vary: Cookie
Expires: Wed, 11 Jan 1984 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, max-age=0
Link: <https://cuiqingcai.com/wp-json/>; rel="https://api.w.org/"
7 實戰三程式碼
'''
有時候,reason屬性返回的不一定是字串,也可能是一個物件。
這裡我們直接設定超時時間來強制丟擲timeout異常
'''
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')
8 實戰三執行結果
E:\WebSpider\venv\Scripts\python.exe E:/WebSpider/3_1_2.py
<class 'socket.timeout'>
TIME OUT
9 實戰三說明
可以發現,reason屬性的結果是socket.timeout類。所以,這裡我們可以用isinstance()方法來判斷它的型別,作出更詳細的異常判斷。