python爬蟲基礎知識整理——urlerror異常處理

1.URLError

首先解釋下URLError可能產生的緣由:html

  • 網絡無鏈接,即本機沒法上網
  • 鏈接不到特定的服務器
  • 服務器不存在

在代碼中,咱們須要用try-except語句來包圍並捕獲相應的異常。編程

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

#輸出結果
1
[Errno 11004] getaddrinfo failed

 2.HTTPError

  • HTTPError是URLError的子類,在你利用urlopen方法發出一個請求時,服務器上都會對應一個應答對象response,其中它包含一個數字」狀態碼」。舉個例子,假如response是一個」重定向」,需定位到別的地址獲取文檔,urllib2將對此進行處理。
  • 其餘不能處理的,urlopen會產生一個HTTPError,對應相應的狀態嗎,HTTP狀態碼錶示HTTP協議所返回的響應的狀態。 
  • HTTPError實例產生後會有一個code屬性,這就是是服務器發送的相關錯誤號。
  • 由於urllib2能夠爲你處理重定向,也就是3開頭的代號能夠被處理,而且100-299範圍的號碼指示成功,因此你只能看到400-599的錯誤號碼。

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

咱們知道,HTTPError的父類是URLError,根據編程經驗,父類的異常應當寫到子類異常的後面,若是子類捕獲不到,那麼能夠捕獲父類的異常,因此上述的代碼能夠這麼改寫網絡

若是捕獲到了HTTPError,則輸出code,不會再處理URLError異常。若是發生的不是HTTPError,則會去捕獲URLError異常,輸出錯誤緣由。ui

另外還能夠加入 hasattr屬性提早對屬性進行判斷,代碼改寫以下url

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

轉自崔慶才博客https://cuiqingcai.com/961.htmlspa

相關文章
相關標籤/搜索