摘要:最后用來處理正常的邏輯,這是一個較好的異常處理寫法。上一篇文章網絡爬蟲實戰使用發送請求下一篇文章網絡爬蟲實戰使用解析鏈接
上一篇文章:Python3網絡爬蟲實戰---20、使用Urllib:發送請求
下一篇文章:Python3網絡爬蟲實戰---22、使用Urllib:解析鏈接
在前面一節我們了解了 Request 的發送過程,但是在網絡情況不好的情況下,出現了異常怎么辦呢?這時如果我們不處理這些異常,程序很可能報錯而終止運行,所以異常處理還是十分有必要的。
Urllib 的 error 模塊定義了由 request 模塊產生的異常。如果出現了問題,request 模塊便會拋出 error 模塊中定義的異常,本節會對其進行詳細的介紹。
1. URLErrorURLError 類來自 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)
我們打開一個不存在的頁面,照理來說應該會報錯,但是這時我們捕獲了 URLError 這個異常,運行結果如下:
Not Found
程序沒有直接報錯,而是輸出了如上內容,這樣通過如上操作,我們就可以避免程序異常終止,同時異常得到了有效處理。
2. HTTPError它是 URLError 的子類,專門用來處理 HTTP 請求錯誤,比如認證請求失敗等等。
它有三個屬性。
code,返回 HTTP Status Code,即狀態碼,比如 404 網頁不存在,500 服務器內部錯誤等等。
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=" ")
運行結果:
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
依然是同樣的網址,在這里我們捕獲了 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=" ") except error.URLError as e: print(e.reason) else: print("Request Successfully")
這樣我們就可以做到先捕獲 HTTPError,獲取它的錯誤狀態碼、原因、Headers 等詳細信息。如果非 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")
在這里我們直接設置了超時時間來強制拋出 timeout 異常。
運行結果如下:
TIME OUT
可以發現 reason 屬性的結果是 socket.timeout 類。所以在這里我們可以用 isinstance() 方法來判斷它的類型,做出更詳細的異常判斷。
3. 結語本節講述了 error 模塊的相關用法,通過合理地捕獲異常可以做出更準確的異常判斷,使得程序更佳穩健。
上一篇文章:Python3網絡爬蟲實戰---20、使用Urllib:發送請求
下一篇文章:Python3網絡爬蟲實戰---22、使用Urllib:解析鏈接
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/44073.html
摘要:上一篇文章網絡爬蟲實戰使用處理異常下一篇文章網絡爬蟲實戰使用分析協議庫里還提供了這個模塊,它定義了處理的標準接口,例如實現各部分的抽取,合并以及鏈接轉換。上一篇文章網絡爬蟲實戰使用處理異常下一篇文章網絡爬蟲實戰使用分析協議 上一篇文章:Python3網絡爬蟲實戰---21、使用Urllib:處理異常下一篇文章:Python3網絡爬蟲實戰---23、使用Urllib:分析Robots協議...
摘要:下面我們傳入多個參數構建一個來感受一下在這里我們通過四個參數構造了一個,即請求,在中指定了和,傳遞的參數用了和方法來轉成字節流,另外指定了請求方式為。運行結果如下通過觀察結果可以發現,我們成功設置了,以及。用于處理重定向。 上一篇文章:Python3網絡爬蟲實戰---19、代理基本原理下一篇文章:Python3網絡爬蟲實戰---21、使用Urllib:處理異常 學習爬蟲,最初的操作便...
摘要:在前面我們講到了和的概念,我們向網站的服務器發送一個,返回的的便是網頁源代碼。渲染頁面有時候我們在用或抓取網頁時,得到的源代碼實際和瀏覽器中看到的是不一樣的。所以使用基本請求庫得到的結果源代碼可能跟瀏覽器中的頁面源代碼不太一樣。 上一篇文章:Python3網絡爬蟲實戰---16、Web網頁基礎下一篇文章:Python3網絡爬蟲實戰---18、Session和Cookies 爬蟲,即網...
摘要:比如我們以知乎為例,直接利用來維持登錄狀態。測試后,發現同樣可以正常登錄知乎。上一篇文章網絡爬蟲實戰基本使用下一篇文章網絡爬蟲實戰正則表達式 上一篇文章:Python3網絡爬蟲實戰---24、requests:基本使用下一篇文章:Python3網絡爬蟲實戰---26、正則表達式 在前面一節我們了解了 Requests 的基本用法,如基本的 GET、POST 請求以及 Response...
摘要:比如我們可以設置這就代表我們設置的規則對百度爬蟲是有效的。上一篇文章網絡爬蟲實戰使用解析鏈接下一篇文章網絡爬蟲實戰基本使用 上一篇文章:Python3網絡爬蟲實戰---22、使用Urllib:解析鏈接下一篇文章:Python3網絡爬蟲實戰---24、requests:基本使用 利用 Urllib 的 robotparser 模塊我們可以實現網站 Robots 協議的分析,本節我們來簡...
閱讀 2973·2023-04-26 02:29
閱讀 585·2019-08-30 15:54
閱讀 1658·2019-08-29 13:13
閱讀 601·2019-08-28 17:51
閱讀 2722·2019-08-26 13:58
閱讀 1532·2019-08-26 13:27
閱讀 2820·2019-08-26 11:39
閱讀 3445·2019-08-26 10:46