在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ URLError 異常處理
綜述
Cookie 的使用
爬蟲基礎(chǔ)了解
計算大學(xué)本學(xué)期績點(diǎn)
抓取淘寶 MM 照片
爬蟲框架 Scrapy 安裝配置
模擬登錄淘寶并獲取所有訂單
Urllib 庫的高級用法
URLError 異常處理
正則表達(dá)式
Beautiful Soup 的用法
爬取糗事百科段子
爬取百度貼吧帖子
Urllib 庫的基本使用

URLError 異常處理

大家好,本節(jié)在這里主要說的是 URLError 還有 HTTPError,以及對它們的一些處理。

3 URLError

首先解釋下 URLError 可能產(chǎn)生的原因:

  • 網(wǎng)絡(luò)無連接,即本機(jī)無法上網(wǎng)
  • 連接不到特定的服務(wù)器
  • 服務(wù)器不存在

在代碼中,我們需要用 try-except 語句來包圍并捕獲相應(yīng)的異常。下面是一個例子,先感受下它的風(fēng)騷

import urllib2
requset = urllib2.Request('http://www.xxxxx.com')
try:
    urllib2.urlopen(requset)
except urllib2.URLError, e:
    print e.reason  

我們利用了 urlopen 方法訪問了一個不存在的網(wǎng)址,運(yùn)行結(jié)果如下:

[Errno 11004] getaddrinfo failed  

它說明了錯誤代號是11004,錯誤原因是 getaddrinfo failed

HTTPError

HTTPError 是 URLError 的子類,在你利用 urlopen 方法發(fā)出一個請求時,服務(wù)器上都會對應(yīng)一個應(yīng)答對象 response,其中它包含一個數(shù)字”狀態(tài)碼”。舉個例子,假如 response 是一個”重定向”,需定位到別的地址獲取文檔,urllib2 將對此進(jìn)行處理。

其他不能處理的,urlopen 會產(chǎn)生一個 HTTPError,對應(yīng)相應(yīng)的狀態(tài)嗎,HTTP 狀態(tài)碼表示HTTP 協(xié)議所返回的響應(yīng)的狀態(tài)。下面將狀態(tài)碼歸結(jié)如下:

100:繼續(xù)  客戶端應(yīng)當(dāng)繼續(xù)發(fā)送請求。客戶端應(yīng)當(dāng)繼續(xù)發(fā)送請求的剩余部分,或者如果請求已經(jīng)完成,忽略這個響應(yīng)。  
101: 轉(zhuǎn)換協(xié)議  在發(fā)送完這個響應(yīng)最后的空行后,服務(wù)器將會切換到在 Upgrade 消息頭中定義的那些協(xié)議。只有在切換新的協(xié)議更有好處的時候才應(yīng)該采取類似措施。  
102:繼續(xù)處理   由 WebDAV(RFC 2518)擴(kuò)展的狀態(tài)碼,代表處理將被繼續(xù)執(zhí)行。  
200:請求成功      處理方式:獲得響應(yīng)的內(nèi)容,進(jìn)行處理  
201:請求完成,結(jié)果是創(chuàng)建了新資源。新創(chuàng)建資源的URI可在響應(yīng)的實(shí)體中得到    處理方式:爬蟲中不會遇到  
202:請求被接受,但處理尚未完成    處理方式:阻塞等待  
204:服務(wù)器端已經(jīng)實(shí)現(xiàn)了請求,但是沒有返回新的信 息。如果客戶是用戶代理,則無須為此更新自身的文檔視圖。    處理方式:丟棄  
300:該狀態(tài)碼不被 HTTP/1.0 的應(yīng)用程序直接使用, 只是作為 3XX 類型回應(yīng)的默認(rèn)解釋。存在多個可用的被請求資源。    處理方式:若程序中能夠處理,則進(jìn)行進(jìn)一步處理,如果程序中不能處理,則丟棄  
301:請求到的資源都會分配一個永久的 URL,這樣就可以在將來通過該 URL 來訪問此資源    處理方式:重定向到分配的 URL  
302:請求到的資源在一個不同的 URL 處臨時保存     處理方式:重定向到臨時的 URL  
304:請求的資源未更新     處理方式:丟棄  
400:非法請求     處理方式:丟棄  
401:未授權(quán)     處理方式:丟棄  
403:禁止     處理方式:丟棄  
404:沒有找到     處理方式:丟棄  
500:服務(wù)器內(nèi)部錯誤  服務(wù)器遇到了一個未曾預(yù)料的狀況,導(dǎo)致了它無法完成對請求的處理。一般來說,這個問題都會在**服務(wù)器端**的源代碼出現(xiàn)錯誤時出現(xiàn)。   
501:服務(wù)器無法識別  服務(wù)器不支持當(dāng)前請求所需要的某個功能。當(dāng)服務(wù)器無法識別請求的方法,并且無法支持其對任何資源的請求。  
502:錯誤網(wǎng)關(guān)  作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請求時,從上游服務(wù)器接收到無效的響應(yīng)。  
503:服務(wù)出錯   由于臨時的**服務(wù)器**維護(hù)或者過載,服務(wù)器當(dāng)前無法處理請求。這個狀況是臨時的,并且將在一段時間以后恢復(fù)。    

HTTPError 實(shí)例產(chǎn)生后會有一個 code 屬性,這就是是服務(wù)器發(fā)送的相關(guān)錯誤號。 因?yàn)?urllib2 可以為你處理重定向,也就是 3 開頭的代號可以被處理,并且 100-299 范圍的號碼指示成功,所以你只能看到 400-599 的錯誤號碼。

下面我們寫一個例子來感受一下,捕獲的異常是 HTTPError,它會帶有一個 code 屬性,就是錯誤代號,另外我們又打印了 reason 屬性,這是它的父類 URLError 的屬性。

import urllib2
req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
    urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.code
    print e.reason  

運(yùn)行結(jié)果如下

403
Forbidden  

錯誤代號是 403,錯誤原因是 Forbidden,說明服務(wù)器禁止訪問。

我們知道,HTTPError 的父類是 URLError,根據(jù)編程經(jīng)驗(yàn),父類的異常應(yīng)當(dāng)寫到子類異常的后面,如果子類捕獲不到,那么可以捕獲父類的異常,所以上述的代碼可以這么改寫

import urllib2
req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
    urllib2.urlopen(req)
except urllib2.HTTPError, e:
    print e.code
except urllib2.URLError, e:
    print e.reason
else:
    print "OK"  

如果捕獲到了 HTTPError,則輸出 code,不會再處理 URLError 異常。如果發(fā)生的不是HTTPError,則會去捕獲 URLError 異常,輸出錯誤原因。

另外還可以加入 hasattr 屬性提前對屬性進(jìn)行判斷,代碼改寫如下

import urllib2
req = urllib2.Request('http://blog.csdn.net/cqcre')
try:
    urllib2.urlopen(req)
except urllib2.URLError, e:
    if hasattr(e,"code"):
        print e.code
    if hasattr(e,"reason"):
        print e.reason
else:
    print "OK"  

首先對異常的屬性進(jìn)行判斷,以免出現(xiàn)屬性輸出報錯的現(xiàn)象。

以上,就是對 URLError 和 HTTPError 的相關(guān)介紹,以及相應(yīng)的錯誤處理辦法,小伙伴們加油!