網路爬蟲(三):異常的處理和HTTP狀態碼的分類
上章我們瞭解了抓取網頁的一些基本步驟,
及提出了一個問題。
接下來本章主要講解有關異常處理的問題。
先來說一說HTTP的異常處理問題。
當urlopen不能夠處理一個response時,產生urlError。
不過通常的Python APIs異常如ValueError,TypeError等也會同時產生。
HTTPError是urlError的子類,通常在特定HTTP URLs中產生。
1.URLError
通常,URLError在沒有網路連線(沒有路由到特定伺服器),或者伺服器不存在的情況下產生。
這種情況下,異常同樣會帶有“reason”屬性,它是一個tuple(可以理解為不可變的陣列),
包含了一個錯誤號和一個錯誤資訊。
我們建一個urllib2_test06.py來感受一下異常的處理:
- import urllib2
- req = urllib2.Request('http://www.baibai.com')
- try: urllib2.urlopen(req)
- except urllib2.URLError, e:
- print e.reason
ipython後,import urllib2_test06.py,可以看到列印出來的內容是:
也就是說,錯誤號是-2,內容是Name or service not known
2.HTTPError
伺服器上每一個HTTP應答物件response包含一個數字“狀態碼”。
有時狀態碼指出伺服器無法完成請求。預設的伺服器會為你處理一部份這種應答。
例如:假設response是一個“重定向”,需要客戶端從別的地址獲取文件,urllib2將為你處理。
其它不能處理的,urlopen會產生一個HTTPError。
典型的錯誤包含“404”(頁面無法找到),“403”(請求禁止),和“401”(帶驗證請求)。
HTTP狀態碼錶示HTTP協議所返回的響應的狀態。
比如客戶端向伺服器傳送請求,如果成功地獲得請求的資源,則返回的狀態碼為200,表示響應成功。
如果請求資源不存在,則通常返回404錯誤。
HTTP狀態碼通常分為5種型別,分別以1~5五個數字開頭,由3位整陣列成:
-----------------------------------------------------------------------------------------------------------------------------------------------------
200:請求成功 處理方式:獲得響應的內容,進行處理
201:請求完成。結果是建立了新資源,新建立資源的URI可在響應的實體中得到 處理方式:爬蟲中不會遇到
202:請求被接受。但處理尚未完成 處理方式:阻塞等待
204:伺服器端已經實現了請求。但沒有返回新的資訊,如果客戶是使用者代理,則無需為此更新自身的文件檢視 處理方式:丟棄
300:該狀態碼不被HTTP/1.0的應用程式直接使用,只是作為3XX型別的迴應的預設解釋。存在多個可用的被請求資源。 處理方式:若程式中能夠處理,則進行進一步處理,如果程式中不能處理,則丟棄
301:請求到的資源都會分配一個永久的URL,這樣就可以在將來通過該URL來訪問此資源 處理方式:重定向到分配的URL
302:請求到的資源都在一個不同URL處臨時儲存 處理方式:重定向到臨時的URL
304:請求的資源未更新 處理方式:丟棄
400:非法請求 處理方式:丟棄
401:未授權 處理方式:丟棄
403:禁止 處理方式:丟棄
404:沒有找到 處理方式:丟棄
5XX:迴應程式碼以“5”開頭的狀態碼錶示伺服器端發現自己出現錯誤,不能繼續執行請求 處理方式:丟棄
------------------------------------------------------------------------------------------------------------------------------------------------------------------
HTTPError實力產生後會有一個整型‘code’屬性,是伺服器傳送的相關錯誤號。
Error Codes錯誤碼
因為預設的處理器處理了重定向(300以外號碼),並且100-299範圍的號碼指示成功,所以你只能看到400-599的錯誤號碼。
BaseHTTPServer。BaseHTTPRequestHandler.response是一個很有用的應答號碼字典,顯示了HTTP協議使用的所有的應答號。
當一個錯誤號產生後,伺服器返回一個HTTP錯誤號,和一個錯誤頁面。
你可以使用HTTPError實力作為頁面返回的應答物件response。
這表示和錯誤屬性一樣,它同樣包含了read,geturl和info方法。
我們建一個urllib2_test07.py來感受一下:
- import urllib2
- req = urllib2.Request('http://bbs.csdn.net/callmewhy')
- try:
- urllib2.urlopen(req)
- except urllib2.URLError, e:
- print e.code
- #print e.read()
3.Wrapping
所以如果你想為HTTPError或URLError做準備,將有兩個基本的辦法。推薦使用第二種。
我們建一個urrlib2_test08.py來感受一下第一種異常處理方案:
- from urllib2 import Request, urlopen, URLError, HTTPError
- req = Request('http://bbs.csdn.net/callmewhy')
- try:
- response = urlopen(req)
- except HTTPError, e:
- print 'The server couldn\'t fulfill the request.'
- print 'HTTPError code: ', e.code
- except URLError, e:
- print 'We failed to reach a server.'
- print 'Reason: ', e.reason
- else:
- print 'No exception was raised.'
- # everything is fine
和其它語言相似,try之後捕獲異常並且將其內容列印出來。
這裡要注意一點,except HTTPError必須在第一個,否則except URLError將同樣接收到HTTPError。
因為HTTPError是URLError的字類,如果URLError在前面它會捕抓到所有的URLError(包括HTTPError)。
我們建一個urllib2_test09.py來感受一下第二種異常處理的方案:
- from urllib2 import Request, urlopen, URLError, HTTPError
- req = Request('http://bbs.csdn.net/callmewhy')
- try:
- response = urlopen(req)
- except URLError, e:
- if hasattr(e, 'code'):
- print 'The server couldn\'t fulfill the request.'
- print 'Error code: ', e.code
- elif hasattr(e, 'reason'):
- print 'We failed to reach a server.'
- print 'Reason: ', e.reason
- else:
- print 'No exception was raised.'
- # everything is fine
(上面程式碼本人都在同一檔案urllib2_test06.py中進行,為了講解方便分成多個檔案進行)
相關文章
- Linux企業級專案實踐之網路爬蟲(10)——處理HTTP狀態碼Linux爬蟲HTTP
- 網路爬蟲之關於爬蟲 http 代理的常見使用方式爬蟲HTTP
- 常見的四類HTTP狀態碼介紹HTTP
- 常見的HTTP狀態碼HTTP
- HTTP爬蟲被封如何處理?HTTP爬蟲
- Python爬蟲入門(5):URLError異常處理Python爬蟲Error
- 如何處理識別出的網路爬蟲爬蟲
- 爬蟲的分類爬蟲
- 常見HTTP狀態碼HTTP
- 常見的http協議狀態碼HTTP協議
- 什麼是Python網路爬蟲?常見的網路爬蟲有哪些?Python爬蟲
- 用Kotlin的方式來處理網路異常Kotlin
- 常見Http狀態碼大全HTTP
- dns解析狀態異常怎麼處理 dns解析異常怎麼修復DNS
- 常見的HTTP狀態碼深入理解HTTP
- 異常的處理
- 異常-throws的方式處理異常
- HTTP的狀態碼HTTP
- HTTP 常見狀態碼說明HTTP
- HTTP協議(三):狀態碼HTTP協議
- 記錄Laravel異常處理類Laravel
- 重寫Laravel異常處理類Laravel
- 網路爬蟲三大特性爬蟲
- Win10提示lsp狀態異常如何解決 lsp網路連線異常的方法Win10
- 反-反爬蟲:用幾行程式碼寫出和人類一樣的動態爬蟲爬蟲行程
- 反 反爬蟲:用幾行程式碼寫出和人類一樣的動態爬蟲爬蟲行程
- 介面異常狀態統一處理方案:優先業務端處理,再按需統一處理。
- Java異常處理設計(三)Java
- PHP錯誤處理和異常處理PHP
- HTTP狀態碼的理解HTTP
- 常用的HTTP狀態碼HTTP
- 最全的 http 狀態碼HTTP
- [php]http的狀態碼PHPHTTP
- 網路是社會的投影,網路空間的垃圾也需要專業的第三方“分類”和“處理”
- 常見HTTP/FTP/WebSockets狀態碼大全HTTPFTPWeb
- 約束和異常處理
- 迭代器和異常處理
- 異常篇——異常處理