python爬蟲-異常處理


URLerror產生原因:

  • 網絡未連接(即不能上網)
  • 服務器不存在

 

1 #-*-coding:utf-8-*-
2 import urllib2
3 request=urllib2.Request('http://www.wujiadong.com')
#這是一個不能打開的網址
4 response=urllib2.urlopen(request) 5 html=response.read() 6 print(html)

 

報錯情況:

 

下面我們對可能出現異常進行處理,一般通過try-except語句來包圍並捕獲相應的異常。我們先嘗試一下:

 

 1 #-*-coding:utf-8-*-
 2 import urllib2
 3 try:
 4     request=urllib2.Request('http://www.wujiadong.com')
 5     response=urllib2.urlopen(request)
 6     html=response.read()
 7 except:
 8     print('something wrong')
 9 else:
10     print(html)

 

常用另一種:

 

1 import urllib2
2 request=urllib2.Request('http://www.wujiadong.com')
3 try: 
urllib2.urlopen(request)
4 except:
urllib2.URLError,e:
5 print(e.reason)

異常處理的終極完整形態

1 try:
# 框住了你感覺會拋出異常的代碼
2 print(a[6]) 3 except:
#try代碼塊里的代碼如果拋出異常了,該執行什么內容
4 print('haha') 5 else:
#try代碼塊里的代碼如果沒有跑出異常,就執行這里
6 print('hehe') 7 finally:
#不管如何,finally里的代碼,是總會執行的
8 print('xixi')

HTTPError

在你利用urlopen方法發出一個請求時,服務器上都會對應一個應答對象response,其中它包含

一個數字”狀態碼。例如:假如response是一個"重定向",需要客戶端從別的地址獲取文檔,

urllib2將為你處理。其他不能處理的,urlopen會產生一個HTTPError。

典型的錯誤包含"404"(頁面無法找到),"403"(請求禁止),和"401"(帶驗證請求)。

HTTP狀態碼表示HTTP協議所返回的響應的狀態。

比如客戶端向服務器發送請求,如果成功地獲得請求的資源,則返回的狀態碼為200,表示響應成功。

如果請求的資源不存在, 則通常返回404錯誤。 

HTTP狀態碼通常分為5種類型,分別以1~5五個數字開頭,由3位整數組成:

 1     100:繼續  客戶端應當繼續發送請求。客戶端應當繼續發送請求的剩余部分,或者如果請求已經完成,忽略這個響應。
 2 
 3     101: 轉換協議  在發送完這個響應最后的空行后,服務器將會切換到在Upgrade 消息頭中定義的那些協議。只有在切換新的協議更有好處的時候才應該采取類似措施。
 4 
 5     102:繼續處理   由WebDAV(RFC 2518)擴展的狀態碼,代表處理將被繼續執行。
 6 
 7     200:請求成功      處理方式:獲得響應的內容,進行處理
 8 
 9     201:請求完成,結果是創建了新資源。新創建資源的URI可在響應的實體中得到    處理方式:爬蟲中不會遇到
10 
11     202:請求被接受,但處理尚未完成    處理方式:阻塞等待
12 
13     204:服務器端已經實現了請求,但是沒有返回新的信 息。如果客戶是用戶代理,則無須為此更新自身的文檔視圖。    處理方式:丟棄
14 
15     300:該狀態碼不被HTTP/1.0的應用程序直接使用, 只是作為3XX類型回應的默認解釋。存在多個可用的被請求資源。    處理方式:若程序中能夠處理,則進行進一步處理,如果程序中不能處理,則丟棄
16     301:請求到的資源都會分配一個永久的URL,這樣就可以在將來通過該URL來訪問此資源    處理方式:重定向到分配的URL
17 
18     302:請求到的資源在一個不同的URL處臨時保存     處理方式:重定向到臨時的URL
19 
20     304:請求的資源未更新     處理方式:丟棄
21 
22     400:非法請求     處理方式:丟棄
23 
24     401:未授權     處理方式:丟棄
25 
26     403:禁止     處理方式:丟棄
27 
28     404:沒有找到     處理方式:丟棄
29 
30     500:服務器內部錯誤  服務器遇到了一個未曾預料的狀況,導致了它無法完成對請求的處理。一般來說,這個問題都會在服務器端的源代碼出現錯誤時出現。
31 
32     501:服務器無法識別  服務器不支持當前請求所需要的某個功能。當服務器無法識別請求的方法,並且無法支持其對任何資源的請求。
33 
34     502:錯誤網關  作為網關或者代理工作的服務器嘗試執行請求時,從上游服務器接收到無效的響應。
35 
36     503:服務出錯   由於臨時的服務器維護或者過載,服務器當前無法處理請求。這個狀況是臨時的,並且將在一段時間以后恢復。
     HTTPError實例產生后會有一個整型'code'屬性,是服務器發送的相關錯誤號。
   Error Codes錯誤碼
   因為默認的處理器處理了重定向(300以外號碼),並且100-299范圍的號碼指示成功,所以你只能看到400-599的錯誤號碼。
1 import urllib2
2 request=urllib2.Request('http://bbs.csdn.net/callmewhy')
3 try: urllib2.urlopen(request)
4 except urllib2.URLError,e:
5    print(e.code)
6 #  print(e.reason)
7 # print(e.read())

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

方法一:加入 hasattr屬性提前對屬性進行判斷,來處理異常

 1 from urllib2 import Request,urlopen,URLError,HTTPError
 2 request=Request('http://blog.csdn.net/cqcre')
 3 try:
 4    response=urlopen(request)
 5 
 6 except URLError,e:
 7 
 8    if hasattr(e,'code'):
 9       print('the server couldn\'t fulfill the request')
10       print('Error code:',e.code)
11    elif hasattr(e,'reason'):
12       print('we failed to reach a server')
13       print('Reason:',e.reason)
14 else:
15    print('no exception was raised')
16    # everything is ok

方法二:暫時未寫

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM