爬蟲原理與數(shù)據(jù)抓取之七: URLError 和 HTTPError

urllib2 的異常錯(cuò)誤處理

  • 在我們用urlopen或opener.open方法發(fā)出一個(gè)請(qǐng)求時(shí),如果urlopen或opener.open不能處理這個(gè)response,就產(chǎn)生錯(cuò)誤。
  • 這里主要說的是URLError和HTTPError,以及對(duì)它們的錯(cuò)誤處理。

URLError

  • URLError 產(chǎn)生的原因主要有:
    • 沒有網(wǎng)絡(luò)連接
    • 服務(wù)器連接失敗
    • 找不到指定的服務(wù)器
  • 我們可以用try except語(yǔ)句來捕獲相應(yīng)的異常。下面的例子里我們?cè)L問了一個(gè)不存在的域名:
# urllib2_urlerror.py

import urllib2

requset = urllib2.Request('http://www.ajkfhafwjqh.com')

try:
    urllib2.urlopen(request, timeout=5)
except urllib2.URLError, err:
    print err
  • 運(yùn)行結(jié)果如下:
<urlopen error [Errno 8] nodename nor servname provided, or not known>
urlopen error,錯(cuò)誤代碼8,錯(cuò)誤原因是沒有找到指定的服務(wù)器。

HTTPError

  • HTTPError是URLError的子類,我們發(fā)出一個(gè)請(qǐng)求時(shí),服務(wù)器上都會(huì)對(duì)應(yīng)一個(gè)response應(yīng)答對(duì)象,其中它包含一個(gè)數(shù)字"響應(yīng)狀態(tài)碼"。
  • 如果urlopen或opener.open不能處理的,會(huì)產(chǎn)生一個(gè)HTTPError,對(duì)應(yīng)相應(yīng)的狀態(tài)碼,HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應(yīng)的狀態(tài)。
注意,urllib2可以為我們處理重定向的頁(yè)面(也就是3開頭的響應(yīng)碼),100-299范圍的號(hào)碼表示成功,所以我們只能看到400-599的錯(cuò)誤號(hào)碼。
# urllib2_httperror.py
import urllib2
requset = urllib2.Request('http://blog.baidu.com/itcast')
try:
    urllib2.urlopen(requset)
except urllib2.HTTPError, err:
    print err.code
    print err
  • 運(yùn)行結(jié)果如下:
    404
    HTTP Error 404: Not Found
    

HTTP Error,錯(cuò)誤代號(hào)是404,錯(cuò)誤原因是Not Found,說明服務(wù)器無法找到被請(qǐng)求的頁(yè)面。
通常產(chǎn)生這種錯(cuò)誤的,要么url不對(duì),要么ip被封。

改進(jìn)版

  • 由于HTTPError的父類是URLError,所以父類的異常應(yīng)當(dāng)寫到子類異常的后面,所以上述的代碼可以這么改寫:
# urllib2_botherror.py

import urllib2

requset = urllib2.Request('http://blog.baidu.com/itcast')

try:
    urllib2.urlopen(requset)

except urllib2.HTTPError, err:
    print err.code

except urllib2.URLError, err:
    print err

else:
    print "Good Job"
  • 運(yùn)行結(jié)果如下:
    404
  • 這樣我們就可以做到,首先捕獲子類的異常,如果子類捕獲不到,那么可以捕獲父類的異常。

HTTP響應(yīng)狀態(tài)碼參考:

1xx:信息

  • 100 Continue : 服務(wù)器僅接收到部分請(qǐng)求,但是一旦服務(wù)器并沒有拒絕該請(qǐng)求,客戶端應(yīng)該繼續(xù)發(fā)送其余的請(qǐng)求。
  • 101 Switching Protocols : 服務(wù)器轉(zhuǎn)換協(xié)議:服務(wù)器將遵從客戶的請(qǐng)求轉(zhuǎn)換到另外一種協(xié)議。

2xx:成功

  • 200 OK : 請(qǐng)求成功(其后是對(duì)GET和POST請(qǐng)求的應(yīng)答文檔)
  • 201 Created : 請(qǐng)求被創(chuàng)建完成,同時(shí)新的資源被創(chuàng)建。
  • 202 Accepted : 供處理的請(qǐng)求已被接受,但是處理未完成。
  • 203 Non-authoritative Information : 文檔已經(jīng)正常地返回,但一些應(yīng)答頭可能不正確,因?yàn)槭褂玫氖俏臋n的拷貝。
  • 204 No Content : 沒有新文檔。瀏覽器應(yīng)該繼續(xù)顯示原來的文檔。如果用戶定期地刷新頁(yè)面,而Servlet可以確定用戶文檔足夠新,這個(gè)狀態(tài)代碼是很有用的。
  • 205 Reset Content : 沒有新文檔。但瀏覽器應(yīng)該重置它所顯示的內(nèi)容。用來強(qiáng)制瀏覽器清除表單輸入內(nèi)容。
  • 206 Partial Content : 客戶發(fā)送了一個(gè)帶有Range頭的GET請(qǐng)求,服務(wù)器完成了它。

3xx:重定向

  • 300 Multiple Choices : 多重選擇。鏈接列表。用戶可以選擇某鏈接到達(dá)目的地。最多允許五個(gè)地址。
  • 301 Moved Permanently : 所請(qǐng)求的頁(yè)面已經(jīng)轉(zhuǎn)移至新的url。
  • 302 Moved Temporarily : 所請(qǐng)求的頁(yè)面已經(jīng)臨時(shí)轉(zhuǎn)移至新的url。
  • 303 See Other : 所請(qǐng)求的頁(yè)面可在別的url下被找到。
  • 304 Not Modified : 未按預(yù)期修改文檔??蛻舳擞芯彌_的文檔并發(fā)出了一個(gè)條件性的請(qǐng)求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務(wù)器告訴客戶,原來緩沖的文檔還可以繼續(xù)使用。
  • 305 Use Proxy : 客戶請(qǐng)求的文檔應(yīng)該通過Location頭所指明的代理服務(wù)器提取。
  • 306 Unused : 此代碼被用于前一版本。目前已不再使用,但是代碼依然被保留。
  • 307 Temporary Redirect : 被請(qǐng)求的頁(yè)面已經(jīng)臨時(shí)移至新的url。

4xx:客戶端錯(cuò)誤

  • 400 Bad Request : 服務(wù)器未能理解請(qǐng)求。
  • 401 Unauthorized : 被請(qǐng)求的頁(yè)面需要用戶名和密碼。
    • 401.1 : 登錄失敗。
    • 401.2 : 服務(wù)器配置導(dǎo)致登錄失敗。
    • 401.3 : 由于 ACL 對(duì)資源的限制而未獲得授權(quán)。
    • 401.4 : 篩選器授權(quán)失敗。
    • 401.5 : ISAPI/CGI 應(yīng)用程序授權(quán)失敗。
    • 401.7 : 訪問被 Web 服務(wù)器上的 URL 授權(quán)策略拒絕。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
  • 402 Payment Required : 此代碼尚無法使用。
  • 403 Forbidden : 對(duì)被請(qǐng)求頁(yè)面的訪問被禁止。
    • 403.1 : 執(zhí)行訪問被禁止。
    • 403.2 : 讀訪問被禁止。
    • 403.3 : 寫訪問被禁止。
    • 403.4 : 要求 SSL。
    • 403.5 : 要求 SSL 128。
    • 403.6 : IP 地址被拒絕。
    • 403.7 : 要求客戶端證書。
    • 403.8 : 站點(diǎn)訪問被拒絕。
    • 403.9 : 用戶數(shù)過多。
    • 403.10 : 配置無效。
    • 403.11 : 密碼更改。
    • 403.12 : 拒絕訪問映射表。
    • 403.13 : 客戶端證書被吊銷。
    • 403.14 : 拒絕目錄列表。
    • 403.15 : 超出客戶端訪問許可。
    • 403.16 : 客戶端證書不受信任或無效。
    • 403.17 : 客戶端證書已過期或尚未生效。
    • 403.18 : 在當(dāng)前的應(yīng)用程序池中不能執(zhí)行所請(qǐng)求的 URL。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
    • 403.19 : 不能為這個(gè)應(yīng)用程序池中的客戶端執(zhí)行 CGI。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
    • 403.20 : Passport 登錄失敗。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
  • 404 Not Found : 服務(wù)器無法找到被請(qǐng)求的頁(yè)面。
    • 404.0 : 沒有找到文件或目錄。
    • 404.1 : 無法在所請(qǐng)求的端口上訪問 Web 站點(diǎn)。
    • 404.2 : Web 服務(wù)擴(kuò)展鎖定策略阻止本請(qǐng)求。
    • 404.3 : MIME 映射策略阻止本請(qǐng)求。
  • 405 Method Not Allowed請(qǐng)求中指定的方法不被允許。
  • 406 Not Acceptable : 服務(wù)器生成的響應(yīng)無法被客戶端所接受。
  • 407 Proxy Authentication Required : 用戶必須首先使用代理服務(wù)器進(jìn)行驗(yàn)證,這樣請(qǐng)求才會(huì)被處理。
  • 408 Request Timeout : 請(qǐng)求超出了服務(wù)器的等待時(shí)間。
  • 409 Conflict : 由于沖突,請(qǐng)求無法被完成。
  • 410 Gone : 被請(qǐng)求的頁(yè)面不可用。
  • 411 Length Required : "Content-Length" 未被定義。如果無此內(nèi)容,服務(wù)器不會(huì)接受請(qǐng)求。
  • 412 Precondition Failed : 請(qǐng)求中的前提條件被服務(wù)器評(píng)估為失敗。
  • 413 Request Entity Too Large : 由于所請(qǐng)求的實(shí)體的太大,服務(wù)器不會(huì)接受請(qǐng)求。
  • 414 Request-url Too Long : 由于url太長(zhǎng),服務(wù)器不會(huì)接受請(qǐng)求。當(dāng)post請(qǐng)求被轉(zhuǎn)換為帶有很長(zhǎng)的查詢信息的get請(qǐng)求時(shí),就會(huì)發(fā)生這種情況。
  • 415 Unsupported Media Type : 由于媒介類型不被支持,服務(wù)器不會(huì)接受請(qǐng)求。
  • 416 Requested Range Not Satisfiable : 服務(wù)器不能滿足客戶在請(qǐng)求中指定的Range頭。
  • 417 Expectation Failed : 執(zhí)行失敗。
  • 423 : 鎖定的錯(cuò)誤。

5xx:服務(wù)器錯(cuò)誤

  • 500 Internal Server Error : 請(qǐng)求未完成。服務(wù)器遇到不可預(yù)知的情況。
    • 500.12 : 應(yīng)用程序正忙于在 Web 服務(wù)器上重新啟動(dòng)。
    • 500.13 : Web 服務(wù)器太忙。
    • 500.15 : 不允許直接請(qǐng)求 Global.asa。
    • 500.16 : UNC 授權(quán)憑據(jù)不正確。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
    • 500.18 : URL 授權(quán)存儲(chǔ)不能打開。這個(gè)錯(cuò)誤代碼為 IIS 6.0 所專用。
    • 500.100 : 內(nèi)部 ASP 錯(cuò)誤。
  • 501 Not Implemented : 請(qǐng)求未完成。服務(wù)器不支持所請(qǐng)求的功能。
  • 502 Bad Gateway : 請(qǐng)求未完成。服務(wù)器從上游服務(wù)器收到一個(gè)無效的響應(yīng)。
    • 502.1 : CGI 應(yīng)用程序超時(shí)?! ?/li>
    • 502.2 : CGI 應(yīng)用程序出錯(cuò)。
  • 503 Service Unavailable : 請(qǐng)求未完成。服務(wù)器臨時(shí)過載或當(dāng)機(jī)。
  • 504 Gateway Timeout : 網(wǎng)關(guān)超時(shí)。
  • 505 HTTP Version Not Supported : 服務(wù)器不支持請(qǐng)求中指明的HTTP協(xié)議版本
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評(píng)論 19 139
  • 一、概念(載錄于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434閱讀 8,726評(píng)論 6 152
  • 工作流程 一次HTTP操作稱為一個(gè)事務(wù),其工作過程可分為四步: 1)首先客戶機(jī)與服務(wù)器需要建立連接。只要單擊某個(gè)超...
    保川閱讀 4,718評(píng)論 2 14
  • 2系列200 OK請(qǐng)求已成功,請(qǐng)求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回。201 Created請(qǐng)求已經(jīng)被實(shí)現(xiàn),而且...
    Y像夢(mèng)一樣自由閱讀 3,686評(píng)論 1 5
  • 我們總以為來日方長(zhǎng),可一不小心就是后會(huì)無期。 都希望在最好的年華遇見一個(gè)人,可往往是遇見了一個(gè)人,才迎來最好的年華...
    冰凝紫閱讀 339評(píng)論 0 2

友情鏈接更多精彩內(nèi)容