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)象。