天天看點

Python網絡爬蟲之HTTP的異常處理機制

一、

URLError(URL錯誤異常)

通常,URLError在沒有網絡連接配接(沒有路由到特定伺服器),或者伺服器不存在的情況下産生。這種情況下,異常同樣會帶有"reason"屬性,它是一個tuple(可以了解為不可變的數組),包含了一個錯誤号和一個錯誤資訊。看下面的示例

Python網絡爬蟲之HTTP的異常處理機制

URLError

從程式中可以看到輸出為:[Errno 11004] getaddrinfo failed,也就是說,錯誤号是11004,内容是getaddrinfo failed

二、HTTPError(HTTPError狀态錯誤)

伺服器上每一個HTTP 應答對象response包含一個數字"狀态碼"。有時狀态碼指出伺服器無法完成請求。預設的處理器會為你處理一部分這種應答。例如:假如response是一個"重定向",需要用戶端從别的位址擷取文檔,urllib2将為你處理。其他不能處理的,urlopen會産生一個HTTPError。典型的錯誤包含"404"(頁面無法找到),"403"(請求禁止),和"401"(帶驗證請求)。HTTP狀态碼表示HTTP協定所傳回的響應的狀态。比如用戶端向伺服器發送請求,如果成功地獲得請求的資源,則傳回的狀态碼為200,表示響應成功。如果請求的資源不存在, 則通常傳回404錯誤。 HTTP狀态碼通常分為5種類型,分别以1~5五個數字開頭,由3位整數組成,如:200代表請求成功、304代表請求的資源未更新、400 代表非法請求,詳情見

HTTP狀态碼解析

HTTPError執行個體産生後會有一個整型'code'屬性,是伺服器發送的相關錯誤号。

Error Codes錯誤碼:因為預設的處理器處理了重定向(300以外号碼),并且100-299範圍的号碼訓示成功,是以你隻能看到400-599的錯誤号碼。BaseHTTPServer.BaseHTTPRequestHandler.response是一個很有用的應答号碼字典,顯示了HTTP協定使用的所有的應答号。當一個錯誤号産生後,伺服器傳回一個HTTP錯誤号,和一個錯誤頁面。你可以使用HTTPError執行個體作為頁面傳回的應答對象response。這表示和錯誤屬性一樣,它同樣包含了read,geturl,和info方法。

Python網絡爬蟲之HTTP的異常處理機制

HTTPError

從程式中可以看到輸出了404的錯誤碼,也就說沒有找到這個頁面。

三、HTTP異常處理方式
Python網絡爬蟲之HTTP的異常處理機制

HTTP異常處理方式

從示例中可以看到,兩種方式都能輸出異常:其中第二種中HTTPError必須寫在URLError異常前,因HTTPError是URLError的子類,如果URLError在前面它會捕捉到所有的URLError(包括HTTPError )。