【Python3网络爬虫开发实战】3-基本库的使用 1.2-处理异常
前一節(jié)我們了解了請(qǐng)求的發(fā)送過程,但是在網(wǎng)絡(luò)不好的情況下,如果出現(xiàn)了異常,該怎么辦呢?這時(shí)如果不處理這些異常,程序很可能因報(bào)錯(cuò)而終止運(yùn)行,所以異常處理還是十分有必要的。
urllib的error模塊定義了由request模塊產(chǎn)生的異常。如果出現(xiàn)了問題,request模塊便會(huì)拋出error模塊中定義的異常。
1. URLError
URLError類來自u(píng)rllib庫的error模塊,它繼承自O(shè)SError類,是error異常模塊的基類,由request模塊生的異常都可以通過捕獲這個(gè)類來處理。
它具有一個(gè)屬性reason,即返回錯(cuò)誤的原因。
下面用一個(gè)實(shí)例來看一下:
from urllib import request, error try:response = request.urlopen('http://cuiqingcai.com/index.htm') except error.URLError as e:print(e.reason) 復(fù)制代碼我們打開一個(gè)不存在的頁面,照理來說應(yīng)該會(huì)報(bào)錯(cuò),但是這時(shí)我們捕獲了URLError這個(gè)異常,運(yùn)行結(jié)果如下:
Not Found 復(fù)制代碼程序沒有直接報(bào)錯(cuò),而是輸出了如上內(nèi)容,這樣通過如上操作,我們就可以避免程序異常終止,同時(shí)異常得到了有效處理。
2. HTTPError
它是URLError的子類,專門用來處理HTTP請(qǐng)求錯(cuò)誤,比如認(rèn)證請(qǐng)求失敗等。它有如下3個(gè)屬性。
- code:返回HTTP狀態(tài)碼,比如404表示網(wǎng)頁不存在,500表示服務(wù)器內(nèi)部錯(cuò)誤等。
- reason:同父類一樣,用于返回錯(cuò)誤的原因。
- headers:返回請(qǐng)求頭。
下面我們用幾個(gè)實(shí)例來看看:
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, seq='\n') 復(fù)制代碼運(yùn)行結(jié)果如下:
Not Found 404 Server: nginx/1.4.6 (Ubuntu) Date: Wed, 03 Aug 2016 08:54:22 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close X-Powered-By: PHP/5.5.9-1ubuntu4.14 Vary: Cookie Expires: Wed, 11 Jan 1984 05:00:00 GMT Cache-Control: no-cache, must-revalidate, max-age=0 Pragma: no-cache Link: <http://cuiqingcai.com/wp-json/>; rel="https://api.w.org/" 復(fù)制代碼依然是同樣的網(wǎng)址,這里捕獲了HTTPError異常,輸出了reason、code和headers屬性。
因?yàn)閁RLError是HTTPError的父類,所以可以先選擇捕獲子類的錯(cuò)誤,再去捕獲父類的錯(cuò)誤,所以上述代碼更好的寫法如下:
from urllib import request, errortry: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') 復(fù)制代碼這樣就可以做到先捕獲HTTPError,獲取它的錯(cuò)誤狀態(tài)碼、原因、headers等信息。如果不是HTTPError異常,就會(huì)捕獲URLError異常,輸出錯(cuò)誤原因。最后,用else來處理正常的邏輯。這是一個(gè)較好的異常處理寫法。
有時(shí)候,reason屬性返回的不一定是字符串,也可能是一個(gè)對(duì)象。再看下面的實(shí)例:
import socket import urllib.request import urllib.errortry: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') 復(fù)制代碼這里我們直接設(shè)置超時(shí)時(shí)間來強(qiáng)制拋出timeout異常。
運(yùn)行結(jié)果如下:
<class 'socket.timeout'> TIME OUT 復(fù)制代碼可以發(fā)現(xiàn),reason屬性的結(jié)果是socket.timeout類。所以,這里我們可以用isinstance()方法來判斷它的類型,作出更詳細(xì)的異常判斷。
本節(jié)中,我們講述了error模塊的相關(guān)用法,通過合理地捕獲異常可以做出更準(zhǔn)確的異常判斷,使程序更加穩(wěn)健。
本資源首發(fā)于崔慶才的個(gè)人博客靜覓: Python3網(wǎng)絡(luò)爬蟲開發(fā)實(shí)戰(zhàn)教程 | 靜覓
如想了解更多爬蟲資訊,請(qǐng)關(guān)注我的個(gè)人微信公眾號(hào):進(jìn)擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動(dòng)識(shí)別)
總結(jié)
以上是生活随笔為你收集整理的【Python3网络爬虫开发实战】3-基本库的使用 1.2-处理异常的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大公司的前端开发地址
- 下一篇: 【转】C 编译器优化过程中的 Bug