1. 程式人生 > >爬蟲request模組異常處理

爬蟲request模組異常處理

一 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()方法來判斷它的型別,作出更詳細的異常判斷。