python爬蟲之urllib(二)
阿新 • • 發佈:2018-12-18
urllib.error可以接收urllib.request產生的異常,urllib.error有三個方法,如下:
URLError是OSError的一個子類,HTTPError是URLError的一個子類,伺服器上HTTP的響應會返回一個狀態碼,根據這個HTTP狀態碼,我們可以知道我們的訪問是否成功。例如200狀態碼,表示請求成功,再比如常見的404錯誤等。
# -*- coding: UTF-8 -*- from urllib import request from urllib import error url = "http://www.iloveyou.com/" req = request.Request(url) try: response = request.urlopen(req) html = response.read().decode('utf-8') print(html) except error.URLError as e: print(e.reason)
我們可以看到如下執行結果:
[Errno 11002] getaddrinfo failed 獲取地址資訊失敗。
再看下HTTPError異常
# -*- coding: UTF-8 -*- from urllib import request from urllib import error #一個不存在的資源 url = "http://www.douyu.com/Jack_Cui.html" req = request.Request(url) try: responese = request.urlopen(req) # html = responese.read() except error.HTTPError as e: print(e.code)
執行結果:
404 雖然連結伺服器沒有問題,但是所請求的html資源不存在。
URLError和HTTPError混合使用,值得注意的一點是,如果想用HTTPError和URLError一起捕獲異常,那麼需要將HTTPError放在URLError的前面,因為HTTPError是URLError的一個子類。如果URLError放在前面,出現HTTP異常會先響應URLError,這樣HTTPError就捕獲不到錯誤資訊了。
# -*- coding: UTF-8 -*- from urllib import request from urllib import error #一個不存在的資源 url = "http://www.douyu.com/Jack_Cui.html" req = request.Request(url) try: responese = request.urlopen(req) except error.HTTPError as e: print(e.code) except error.URLError as e: print(e.reason)
也可以使用hasattr函式判斷URLError含有的屬性,如果含有reason屬性表明是URLError,如果含有code屬性表明是HTTPError
# -*- coding: UTF-8 -*-
from urllib import request
from urllib import error
#一個不存在的資源
url = "http://www.douyu.com/Jack_Cui.html"
req = request.Request(url)
try:
responese = request.urlopen(req)
except error.URLError as e:
if hasattr(e, 'code'):
print("HTTPError")
print(e.code)
elif hasattr(e, 'reason'):
print("URLError")
print(e.reason)
下載函式的異常 urllib.error.ContentTooShortError(msg,content) 當urlretrieve()函式檢測到下載的資料量小於預期量(由Content-Length頭指定)時引發此異常。內容屬性儲存下載的(以及應該截斷的)資料。