Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)-21、使用Urllib:處理異常

在前面一節(jié)我們了解了 Request 的發(fā)送過程,但是在網(wǎng)絡(luò)情況不好的情況下,出現(xiàn)了異常怎么辦呢?這時如果我們不處理這些異常,程序很可能報錯而終止運行,所以異常處理還是十分有必要的。

成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計、網(wǎng)站制作與策劃設(shè)計,改則網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:改則等地區(qū)。改則做網(wǎng)站價格咨詢:13518219792

Urllib 的 error 模塊定義了由 request 模塊產(chǎn)生的異常。如果出現(xiàn)了問題,request 模塊便會拋出 error 模塊中定義的異常,本節(jié)會對其進行詳細(xì)的介紹。

1. URLError

URLError 類來自 Urllib 庫的 error 模塊,它繼承自 OSError 類,是 error 異常模塊的基類,由 request 模塊生的異常都可以通過捕獲這個類來處理。

它具有一個屬性 reason,即返回錯誤的原因。

下面用一個實例來感受一下:

from urllib import request, error
try:
    response = request.urlopen('http://cuiqingcai.com/index.htm')
except error.URLError as e:
    print(e.reason)

我們打開一個不存在的頁面,照理來說應(yīng)該會報錯,但是這時我們捕獲了 URLError 這個異常,運行結(jié)果如下:

Not?Found
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進階,都?xì)g迎

程序沒有直接報錯,而是輸出了如上內(nèi)容,這樣通過如上操作,我們就可以避免程序異常終止,同時異常得到了有效處理。

2. HTTPError

它是 URLError 的子類,專門用來處理 HTTP 請求錯誤,比如認(rèn)證請求失敗等等。

它有三個屬性。

  • code,返回 HTTP Status Code,即狀態(tài)碼,比如 404 網(wǎng)頁不存在,500 服務(wù)器內(nèi)部錯誤等等。
  • reason,同父類一樣,返回錯誤的原因。
  • headers,返回 Request Headers。

下面我們來用幾個實例感受一下:

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')

運行結(jié)果:

Not Found
404
Date: Mon, 17 Jun 2019 04:52:50 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Status: 404 Not Found
Cache-Control: no-cache
Strict-Transport-Security: max-age=31536000
X-XSS-Protection: 1; mode=block
X-Request-Id: e65fb029-a4fd-46e2-91c3-9616ccc2f879
X-Runtime: 0.006814
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-Powered-By: Phusion Passenger 6.0.2
Server: nginx + Phusion Passenger 6.0.2

依然是同樣的網(wǎng)址,在這里我們捕獲了 HTTPError 異常,輸出了 reason、code、headers 屬性。

因為 URLError 是 HTTPError 的父類,所以我們可以先選擇捕獲子類的錯誤,再去捕獲父類的錯誤,所以上述代碼更好的寫法如下:

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')

這樣我們就可以做到先捕獲 HTTPError,獲取它的錯誤狀態(tài)碼、原因、Headers 等詳細(xì)信息。如果非 HTTPError,再捕獲 URLError 異常,輸出錯誤原因。最后用 else 來處理正常的邏輯,這是一個較好的異常處理寫法。

有時候 reason 屬性返回的不一定是字符串,也可能是一個對象,我們再看下面的實例:

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')

在這里我們直接設(shè)置了超時時間來強制拋出 timeout 異常。

運行結(jié)果如下:

<class 'socket.timeout'>
TIME OUT
Python資源分享qun 784758214 ,內(nèi)有安裝包,PDF,學(xué)習(xí)視頻,這里是Python學(xué)習(xí)者的聚集地,零基礎(chǔ),進階,都?xì)g迎

可以發(fā)現(xiàn) reason 屬性的結(jié)果是 socket.timeout 類。所以在這里我們可以用 isinstance() 方法來判斷它的類型,做出更詳細(xì)的異常判斷。

3. 結(jié)語

本節(jié)講述了 error 模塊的相關(guān)用法,通過合理地捕獲異??梢宰龀龈鼫?zhǔn)確的異常判斷,使得程序更佳穩(wěn)健。

分享題目:Python3網(wǎng)絡(luò)爬蟲實戰(zhàn)-21、使用Urllib:處理異常
網(wǎng)頁URL:http://bm7419.com/article12/igdsdc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶體驗、企業(yè)網(wǎng)站制作網(wǎng)站設(shè)計公司、微信小程序搜索引擎優(yōu)化、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作