1. urllib2的異常錯(cuò)誤處理
在我們用urlopen或opener.open方法發(fā)出一個(gè)請求時(shí),如果urlopen或opener.open不能處理這個(gè)response苍在,就產(chǎn)生錯(cuò)誤绝页。
URLError
URLError產(chǎn)生的原因主要有:
????沒有網(wǎng)絡(luò)連接
????服務(wù)器連接失敗
????找不到指定的服務(wù)器
我們可以用try except語句來捕獲相應(yīng)的異常。下面的例子里我們訪問了一個(gè)不存在的域名:
# urllib2_urlerror.py
import urllib2
request = urllib2.Request("http://www.ajkfhafwjqh.com")
try:
????urllib2.urlopen(request,timeout=5)
????except urllib2.URLError, err:
????????print err
運(yùn)行結(jié)果如下:
urlopen error寂恬,錯(cuò)誤代碼8续誉,錯(cuò)誤原因是沒有找到指定的服務(wù)器。
HTTPError
HTTPError是URLError的子類初肉,我們發(fā)出一個(gè)請求時(shí)酷鸦,服務(wù)器上都會(huì)對應(yīng)一個(gè)response應(yīng)答對象,其中它包含一個(gè)數(shù)字"響應(yīng)狀態(tài)碼"牙咏。
如果urlopen或opener.open不能處理的臼隔,會(huì)產(chǎn)生一個(gè)HTTPError,對應(yīng)相應(yīng)的狀態(tài)碼妄壶,HTTP狀態(tài)碼表示HTTP協(xié)議所返回的響應(yīng)的狀態(tài)摔握。
注意,urllib2可以為我們處理重定向的頁面(也就是3開頭的響應(yīng)碼)丁寄,100-299范圍的號(hào)碼表示成功氨淌,所以我們只能看到400-599的錯(cuò)誤號(hào)碼例嘱。
# urllib2_httperror.py
import urllib2
request = urllib2.Request("http://www.itcast.cn/blog")
try:
????urllib2.urlopen(request)
????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ù)器無法找到
通常產(chǎn)生這種錯(cuò)誤的,要么url不對蛮艰,要么ip被封腋腮。
2. 改進(jìn)版
由于HTTPError的父類是URLError,所以父類的異常應(yīng)當(dāng)寫到子類異常的后面壤蚜,所以上述的代碼可以這么改寫:
# urllib2_botherror.py
import urllib2
request = urllib2.Request("http://www.itcast.cn/blog")
try:
urllib2.urlopen(request)
except urllib2.HTTPError, err:
????print err.code
????except urllib2.URLError, err:
????print err
else:
print "Good Job"
3. 驗(yàn)證有幾個(gè)代理能用
驗(yàn)證有幾個(gè)代理能用,不能用的拋出異常
# -*- coding:utf-8 -*-
import urllib2
URLERRORCODE = 777
def can_use_proxy(request, openner, URLERRORCODE):
????try:
????????response = openner.open(request,timeout=3)
????????returnresponse.getcode()
????except urllib2.HTTPError,err:
????????return err.code
????except urllib2.URLError,err:
????????return URLERRORCODE
if __name__ == '__main__':
????# 1.大量proxy free
????proxy_list = [
????{"https":"117.69.142.196:808"},
????{"http":"101.68.73.54:53281"},
????{"http":"113.87.161.227:8118"},
????{"http":"114.245.149.215:8118"},
????{"http":"195.5.40.109:3128"}
????]
????#驗(yàn)證有幾個(gè)能用
????can_use_list = []
????for proxy in proxy_list:
????????headers ={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; ????WOW64;Trident/7.0; rv:11.0) like Gecko"}
????????request =urllib2.Request("http://www.baidu.com", headers=headers)
????????#創(chuàng)建 代理處理器
????????proxy_handler =urllib2.ProxyHandler(proxy)
????????openner =urllib2.build_opener(proxy_handler)
????????#驗(yàn)證
????????code =can_use_proxy(request, openner, URLERRORCODE)
????????????print code
4. HTTP響應(yīng)狀態(tài)碼參考
1xx:信息
100Continue
服務(wù)器僅接收到部分請求即寡,但是一旦服務(wù)器并沒有拒絕該請求,客戶端應(yīng)該繼續(xù)發(fā)送其余的請求袜刷。
101Switching Protocols
服務(wù)器轉(zhuǎn)換協(xié)議:服務(wù)器將遵從客戶的請求轉(zhuǎn)換到另外一種協(xié)議聪富。
2xx:成功
200OK
請求成功(其后是對GET和POST請求的應(yīng)答文檔)
201Created
請求被創(chuàng)建完成,同時(shí)新的資源被創(chuàng)建著蟹。
202Accepted
供處理的請求已被接受墩蔓,但是處理未完成。
203Non-authoritative Information
文檔已經(jīng)正常地返回萧豆,但一些應(yīng)答頭可能不正確奸披,因?yàn)槭褂玫氖俏臋n的拷貝。
204No Content
沒有新文檔涮雷。瀏覽器應(yīng)該繼續(xù)顯示原來的文檔阵面。如果用戶定期地刷新頁面,而Servlet可以確定用戶文檔足夠新洪鸭,這個(gè)狀態(tài)代碼是很有用的样刷。
205Reset Content
沒有新文檔。但瀏覽器應(yīng)該重置它所顯示的內(nèi)容览爵。用來強(qiáng)制瀏覽器清除表單輸入內(nèi)容置鼻。
206Partial Conten
t客戶發(fā)送了一個(gè)帶有Range頭的GET請求,服務(wù)器完成了它拾枣。
3xx:重定向
300Multiple Choices
多重選擇沃疮。鏈接列表。用戶可以選擇某鏈接到達(dá)目的地梅肤。最多允許五個(gè)地址司蔬。301Moved Permanently
所請求的頁面已經(jīng)轉(zhuǎn)移至新的url。
302Moved?
Temporarily所請求的頁面已經(jīng)臨時(shí)轉(zhuǎn)移至新的url姨蝴。
303See Other所請求的頁面可在別的url下被找到俊啼。
304Not Modified
未按預(yù)期修改文檔∽笠剑客戶端有緩沖的文檔并發(fā)出了一個(gè)條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)授帕。服務(wù)器告訴客戶同木,原來緩沖的文檔還可以繼續(xù)使用。
305Use Proxy
客戶請求的文檔應(yīng)該通過Location頭所指明的代理服務(wù)器提取跛十。
306Unused此代碼被用于前一版本彤路。目前已不再使用,但是代碼依然被保留芥映。307Temporary Redirect被請求的頁面已經(jīng)臨時(shí)移至新的url洲尊。
4xx:
客戶端錯(cuò)誤400Bad Request服務(wù)器未能理解請求。
401Unauthorized
被請求的頁面需要用戶名和密碼奈偏。
401.1
登錄失敗坞嘀。
401.2
服務(wù)器配置導(dǎo)致登錄失敗。
401.3
由于 ACL 對資源的限制而未獲得授權(quán)惊来。
401.4
篩選器授權(quán)失敗丽涩。
401.5ISAPI/CGI?
應(yīng)用程序授權(quán)失敗。
401.7
訪問被 Web 服務(wù)器上的 URL 授權(quán)策略拒絕裁蚁。這個(gè)錯(cuò)誤代碼為 IIS6.0所專用矢渊。402
Payment Required此代碼尚無法使用。
403Forbidden
對被請求頁面的訪問被禁止厘擂。
403.1執(zhí)行訪問被禁止昆淡。
403.2讀訪問被禁止锰瘸。
403.3寫訪問被禁止刽严。
403.4要求 SSL。
403.5要求 SSL128避凝。
403.6IP 地址被拒絕舞萄。
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í)行所請求的 URL盆均。這個(gè)錯(cuò)誤代碼為 IIS6.0所專用。
403.19不能為這個(gè)應(yīng)用程序池中的客戶端執(zhí)行 CGI漱逸。這個(gè)錯(cuò)誤代碼為 IIS6.0所專用泪姨。
403.20Passport 登錄失敗游沿。這個(gè)錯(cuò)誤代碼為 IIS6.0所專用。
404Not Found服務(wù)器無法找到被請求的頁面肮砾。
404.0沒有找到文件或目錄诀黍。
404.1無法在所請求的端口上訪問 Web 站點(diǎn)。
404.2Web 服務(wù)擴(kuò)展鎖定策略阻止本請求仗处。
404.3MIME 映射策略阻止本請求蔗草。
405Method Not Allowed請求中指定的方法不被允許。
406Not Acceptable服務(wù)器生成的響應(yīng)無法被客戶端所接受疆柔。
407Proxy Authentication Required用戶必須首先使用代理服務(wù)器進(jìn)行驗(yàn)證咒精,這樣請求才會(huì)被處理。
408Request Timeout請求超出了服務(wù)器的等待時(shí)間旷档。
409Conflict由于沖突模叙,請求無法被完成。
410Gone被請求的頁面不可用鞋屈。
411Length Required"Content-Length"未被定義范咨。如果無此內(nèi)容,服務(wù)器不會(huì)接受請求厂庇。
412Precondition Failed請求中的前提條件被服務(wù)器評估為失敗渠啊。
413Request Entity Too Large由于所請求的實(shí)體的太大,服務(wù)器不會(huì)接受請求权旷。
414Request-url Too Long由于url太長替蛉,服務(wù)器不會(huì)接受請求。當(dāng)post請求被轉(zhuǎn)換為帶有很長的查詢信息的get請求時(shí)拄氯,就會(huì)發(fā)生這種情況躲查。415Unsupported Media Type由于媒介類型不被支持,服務(wù)器不會(huì)接受請求译柏。416Requested Range Not Satisfiable服務(wù)器不能滿足客戶在請求中指定的Range頭镣煮。
417Expectation Failed執(zhí)行失敗。423鎖定的錯(cuò)誤鄙麦。
5xx:服務(wù)器錯(cuò)誤500Internal Server Error請求未完成典唇。服務(wù)器遇到不可預(yù)知的情況。
500.12應(yīng)用程序正忙于在 Web 服務(wù)器上重新啟動(dòng)胯府。
500.13Web 服務(wù)器太忙介衔。
500.15不允許直接請求 Global.asa。
500.16UNC 授權(quán)憑據(jù)不正確盟劫。這個(gè)錯(cuò)誤代碼為 IIS6.0所專用夜牡。
500.18URL 授權(quán)存儲(chǔ)不能打開。這個(gè)錯(cuò)誤代碼為 IIS6.0所專用。
500.100內(nèi)部 ASP 錯(cuò)誤塘装。
501Not Implemented請求未完成急迂。服務(wù)器不支持所請求的功能。
502Bad Gateway請求未完成蹦肴。服務(wù)器從上游服務(wù)器收到一個(gè)無效的響應(yīng)僚碎。502.1CGI 應(yīng)用程序超時(shí)∫趸希 ·
502.2CGI 應(yīng)用程序出錯(cuò)勺阐。
503Service Unavailable請求未完成。服務(wù)器臨時(shí)過載或當(dāng)機(jī)矛双。
504Gateway Timeout網(wǎng)關(guān)超時(shí)渊抽。
505HTTP Version Not Supported服務(wù)器不支持請求中指明的HTTP協(xié)議版本