1. 程式人生 > >Python爬蟲UrlError和HttpError系列之五

Python爬蟲UrlError和HttpError系列之五

1,概述

在我們用urlopen或opener.open方法發出一個請求時,如果urlopen或opener.open不能處理這個response,就產生錯誤。

這裡主要說的是URLError和HTTPError,以及對它們的錯誤處理。

2,URLError

URLError 產生的原因主要有:

  • 1,沒有網路連線
  • 2,伺服器連線失敗
  • 3,找不到指定的伺服器

3,HTTPError

HTTPError是URLError的子類,我們發出一個請求時,伺服器上都會對應一個response應答物件,其中它包含一個數字”響應狀態碼”。

如果urlopen或opener.open不能處理的,會產生一個HTTPError,對應相應的狀態碼,HTTP狀態碼錶示HTTP協議所返回的響應的狀態。

注意,urllib.request可以為我們處理重定向的頁面(也就是3開頭的響應碼),100-299範圍的號碼錶示成功,所以我們只能看到400-599的錯誤號碼。

4,判斷快代理網站免費的代理是否可用案例

from urllib import request, parse
from http import cookiejar
from urllib.error import URLError, HTTPError


# 通過使用HTTPError和URLError來驗證代理是否可用
def auth_proxy(opener, request, FAILED_CODE):
    try:
        # 傳送請求的時候,設定一個超時時間,
response = opener.open(request, timeout=3) except HTTPError as err: return err.code except URLError as err: return FAILED_CODE else: return response.getcode() if __name__ == "__main__": # 表示URLError FAILED_CODE = 666 # 儲存可用的代理的列表 good_proxy = [] # 從快代理網站獲取免費的代理,檢視哪些可用
proxy_list = [ {"http": "210.29.26.250:80"}, {'http':'125.117.132.239:9000'}, {'http':'183.147.22.6:9000'}, {'http':'114.115.218.71:80'}, ] # 構建一個請求 req = request.Request("http://www.baidu.com/") # 迴圈獲取每個代理,做驗證 for proxy in proxy_list: # 代理處理器物件 proxy_handler = request.ProxyHandler(proxy) # 構建自定義opener opener = request.build_opener(proxy_handler) # print(opener.open(req).read()) # 呼叫auth_proxy 來驗證每個代理是否可用 num = auth_proxy(opener, req, FAILED_CODE) print(num) # 如果返回200,則代理正常,就放到good_proxy列表裡 if num == 200: good_proxy.append(proxy) print("可用的代理為:%s"%good_proxy)

5,HTTP響應狀態碼總結

1xx:資訊

100 Continue
伺服器僅接收到部分請求,但是一旦伺服器並沒有拒絕該請求,客戶端應該繼續傳送其餘的請求。
101 Switching Protocols
伺服器轉換協議:伺服器將遵從客戶的請求轉換到另外一種協議。



2xx:成功

200 OK
請求成功(其後是對GET和POST請求的應答文件)
201 Created
請求被建立完成,同時新的資源被建立。
202 Accepted
供處理的請求已被接受,但是處理未完成。
203 Non-authoritative Information
文件已經正常地返回,但一些應答頭可能不正確,因為使用的是文件的拷貝。
204 No Content
沒有新文件。瀏覽器應該繼續顯示原來的文件。如果使用者定期地重新整理頁面,而Servlet可以確定使用者文件足夠新,這個狀態程式碼是很有用的。
205 Reset Content
沒有新文件。但瀏覽器應該重置它所顯示的內容。用來強制瀏覽器清除表單輸入內容。
206 Partial Content
客戶傳送了一個帶有Range頭的GET請求,伺服器完成了它。



3xx:重定向

300 Multiple Choices
多重選擇。連結列表。使用者可以選擇某連結到達目的地。最多允許五個地址。
301 Moved Permanently
所請求的頁面已經轉移至新的url。
302 Moved Temporarily
所請求的頁面已經臨時轉移至新的url。
303 See Other
所請求的頁面可在別的url下被找到。
304 Not Modified
未按預期修改文件。客戶端有緩衝的文件併發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文件)。伺服器告訴客戶,原來緩衝的文件還可以繼續使用。
305 Use Proxy
客戶請求的文件應該通過Location頭所指明的代理伺服器提取。
306 Unused
此程式碼被用於前一版本。目前已不再使用,但是程式碼依然被保留。
307 Temporary Redirect
被請求的頁面已經臨時移至新的url。



4xx:客戶端錯誤

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



5xx:伺服器錯誤

500 Internal Server Error
請求未完成。伺服器遇到不可預知的情況。
500.12
應用程式正忙於在 Web 伺服器上重新啟動。
500.13
Web 伺服器太忙。
500.15
不允許直接請求 Global.asa。
500.16
UNC 授權憑據不正確。這個錯誤程式碼為 IIS 6.0 所專用。
500.18
URL 授權儲存不能開啟。這個錯誤程式碼為 IIS 6.0 所專用。
500.100
內部 ASP 錯誤。
501 Not Implemented
請求未完成。伺服器不支援所請求的功能。
502 Bad Gateway
請求未完成。伺服器從上游伺服器收到一個無效的響應。
502.1
CGI 應用程式超時。 ·
502.2
CGI 應用程式出錯。
503 Service Unavailable
請求未完成。伺服器臨時過載或當機。
504 Gateway Timeout
閘道器超時。
505 HTTP Version Not Supported
伺服器不支援請求中指明的HTTP協議版本