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