標籤:收信 == ade set www. 函數 close 執行個體 異常
這一節我們主要講解處理異常
在我們發送請求的時候,有的時候可能網路不好,出現了異常,程式因為報錯而終止運行,為此我們需要對其進行處理
urllib裡的error模組定義了request模組產生的異常,下面便介紹裡面的函數:
該類是繼承自OSError類,是error異常模組的基類,由request模組產生的異常都可以由這個類捕抓,它具有一個reason屬性
import urllib.error,urllib.requesttry: response = urllib.request.urlopen(‘https://cuiqingcai.com/index.htm‘)except urllib.error.URLError as e: print(e.reason)
正常程式會報錯,但最終程式輸出的卻是Not Found
值得注意的是,在程式運行中,如果Import 的是import urllib.error那麼後面使用的時候也要urllib.error.URLError,如果import的是from urllib impoort request,error那麼後面就可以直接request.urlopen,error.URLError等
這個是URLError的子類,專門用來處理HTTP的請求錯誤,比如認證請求失敗等,他有三個屬性:
code:返回HTTP狀態代碼,比如404表示網頁不存在,505表示伺服器內部錯誤
reason:返回錯誤的原因
headers:返回要求標頭
下面上執行個體:
from urllib import request,errortry: response = request.urlopen(‘https://cuiqingcai.com/index.htm‘)except error.HTTPError as e: print(e.reason,e.code,e.headers)
===================== RESTART: F:\Python\exercise\ok.py ===================
Not Found 404 Server: nginx/1.10.3 (Ubuntu)Date: Fri, 17 Aug 2018 03:14:05 GMTContent-Type: text/html; charset=UTF-8Transfer-Encoding: chunkedConnection: closeVary: CookieExpires: Wed, 11 Jan 1984 05:00:00 GMTCache-Control: no-cache, must-revalidate, max-age=0Link: <https://cuiqingcai.com/wp-json/>; rel="https://api.w.org/"
因為HTTPError是URLError的子類,所以可以選擇捕獲錯誤時先捕獲子類的,再去捕獲父類的
from urllib import request,errortry: response = request.urlopen(‘https://cuiqingcai.com/index.htm‘)except error.HTTPError as e: print(e.reason,e.code,e.headers)except error.URLError as e: print(e.reason)else: print(‘Request Successfully‘)
有時候reason返回的不是一個字串也可能為一個對象,這時候有可能要用到socket庫
socket 是網路連接端點。例如當你的Web瀏覽器請求www.jb51.net上的首頁時,你的Web瀏覽器建立一個socket並命令它去串連 www.jb51.net的Web伺服器主機,Web伺服器也對來自的請求在一個socket上進行監聽。兩端使用各自的socket來發送和 接收資訊。
import socketimport urllib.requestimport urllib.errortry: 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‘)
===================== RESTART: F:\Python\exercise\ok.py ===================
<class ‘socket.timeout‘>
TIME OUT
可見設定逾時時間使程式強制執行了timeout異常(type函數不會認為子類是父類的一種類型,但isinstance會認為是)
python3網路爬蟲學習——基本庫的使用(3)