《Python網(wǎng)絡(luò)爬蟲》1.2 爬取網(wǎng)頁的異常處理

By 一頁編程


下面我們介紹爬取網(wǎng)頁的一般套路,或者說是流程。什么是一般套路呢?其實(shí)通用的一組代碼,它可以準(zhǔn)確的可靠的爬取網(wǎng)頁上的內(nèi)容。

我們?cè)谟胷equests庫進(jìn)行網(wǎng)頁訪問的時(shí)候,經(jīng)常用get函數(shù),比如:

requests.get(url)

但是這樣的語句并不是一定成立的,因?yàn)榫W(wǎng)絡(luò)連接有風(fēng)險(xiǎn),所以這樣的語句,它的異常處理很重要。

連接異常

Requests庫支持6種常用的連接異常。

異常 說明
ConnectionError 網(wǎng)絡(luò)連接出現(xiàn)了錯(cuò)誤
HttpError 在HTTP協(xié)議層面出現(xiàn)的錯(cuò)誤異常
URLRequired URL缺失造成的異常
TooManyRedirects 超過了最大重定向次數(shù)時(shí)產(chǎn)生的異常
ConnectionTimeout 與服務(wù)器連接超過一個(gè)預(yù)定時(shí)間而產(chǎn)生的異常
Timeout 發(fā)起URL請(qǐng)求到獲得URL請(qǐng)求內(nèi)容過程中,超過了預(yù)定時(shí)間產(chǎn)生的異常
  • ConnectionError表示的是,在用requests庫進(jìn)行訪問的時(shí)候,如果網(wǎng)絡(luò)連接出現(xiàn)了錯(cuò)誤,就會(huì)拋出這樣的異常。比如我們?cè)趯?duì)url做dns查詢的時(shí)候,如果查詢失敗或者服務(wù)器的防火墻,拒絕連接,那么requests庫就會(huì)拋出這樣的異常。
  • HttpError,指的是在http協(xié)議層面出現(xiàn)的錯(cuò)誤異常。
  • URLRequired異常,指的是我們?cè)趯?duì)url訪問的時(shí)候,這個(gè)url缺失造成的異常。
  • TooManyRedirects異常,指的是當(dāng)用戶訪問的url進(jìn)行重定向,而重定向的次數(shù),超過了requests庫要求的最大重定向次數(shù)時(shí)產(chǎn)生的異常。這個(gè)經(jīng)常指我們對(duì)一些復(fù)雜的鏈接進(jìn)行訪問的時(shí)候,會(huì)出現(xiàn)的錯(cuò)誤。
  • ConnectionTimeout異常,指的是在訪問遠(yuǎn)程服務(wù)器的時(shí)候,由于與服務(wù)器連接超過一個(gè)預(yù)定時(shí)間而產(chǎn)生的異常。
  • Timeout異常指的是,發(fā)起url請(qǐng)求到獲得url請(qǐng)求內(nèi)容過程中,超過了約定時(shí)間產(chǎn)生的異常

ConnectionTimeout跟Timeout兩個(gè)異常之間是有一定的區(qū)別的,Timeout是指發(fā)出url請(qǐng)求到獲得內(nèi)容整個(gè)過程的超時(shí)異常。而ConnectionTimeout僅指與遠(yuǎn)程服務(wù)器連接過程產(chǎn)生的超時(shí)異常。

raise_for_status()方法

理解Response類非常重要,Response這樣的一個(gè)對(duì)象返回了所有的網(wǎng)頁內(nèi)容,那么它也提供了一個(gè)方法,叫raise_for_status(),這個(gè)方法是專門與異常打交道的方法,該方法有這樣一個(gè)有趣的功能,它能夠判斷返回的Response類型狀態(tài)是不是200。如果是200,他將表示返回的內(nèi)容是正確的,如果不是200,他就會(huì)產(chǎn)生一個(gè)HttpError的異常。
那這個(gè)方法有什么用呢?
那我們來看一下我們的通用代碼框架:

>>> def getHTMLText(url):
    try:
        r = requests.get(url, timeout = 30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return "產(chǎn)生異常"

這個(gè)代碼中我們用r.raise_for_status()方法,它就可以有效的判斷網(wǎng)絡(luò)連接的狀態(tài)。如果網(wǎng)連接出現(xiàn)錯(cuò)誤,那么它就會(huì)用try-except來獲取一個(gè)異常。而這個(gè)異常,在異常部分,我們用了一句 return “產(chǎn)生異常” 來表示,我們捕獲到了這個(gè)異常,所以這樣一個(gè)通用代碼框架可以有效的處理,我們?cè)谠L問或爬取網(wǎng)頁過程中,它可能出現(xiàn)的一些錯(cuò)誤,或者是網(wǎng)絡(luò)不穩(wěn)定造成的一些現(xiàn)象。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容