1. 程式人生 > >python爬蟲之urllib(二)

python爬蟲之urllib(二)

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頭指定)時引發此異常。內容屬性儲存下載的(以及應該截斷的)資料。