爬虫 spider02——详析http
HTTP協議
1.簡介
HTTP協議(Hyper Text Transfer Protocol,超文本傳輸協議),是用于從萬維網(WWW:World Wide Web )服務器傳輸超文本到本地瀏覽器的傳送協議。
HTTP基于TCP/IP通信協議來傳遞數據。
HTTP基于客戶端/服務端(C/S)架構模型,通過一個可靠的鏈接來交換信息,是一個無狀態的請求/響應協議。
2.特點
(1)HTTP是無連接:無連接的含義是限制每次連接只處理一個請求。服務器處理完客戶的請求,并收到客戶的應答后,即斷開連接。采用這種方式可以節省傳輸時間。
(2)HTTP是媒體獨立的:只要客戶端和服務器知道如何處理的數據內容,任何類型的數據都可以通過HTTP發送。客戶端以及服務器指定使用適合的MIME-type內容類型。
(3)HTTP是無狀態:無狀態是指協議對于事務處理沒有記憶能力。缺少狀態意味著如果后續處理需要前面的信息,則它必須重傳,這樣可能導致每次連接傳送的數據量增大。另一方面,在服務器不需要先前信息時它的應答就較快。
?
HTTP請求報文
HTTP請求報文由3部分組成(請求行+請求頭+請求體):
請求行:
①是請求方法,GET和POST是最常見的HTTP方法,除此以外還包括DELETE、HEAD、OPTIONS、PUT、TRACE。
②為請求對應的URL地址,它和報文頭的Host屬性組成完整的請求URL。
③是協議名稱及版本號。
請求頭:
④是HTTP的報文頭,報文頭包含若干個屬性,格式為“屬性名:屬性值”,服務端據此獲取客戶端的信息。
與緩存相關的規則信息,均包含在header中
請求體:
⑤是報文體,它將一個頁面表單中的組件值通過param1=value1?m2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求參數的數據。不但報文體可以傳遞請求參數,請求URL也可以通過類似于“/chapter15/user.html? param1=value1?m2=value2”的方式傳遞請求參數。?
?
HTTP請求報文頭屬性
Accept?
請求報文可通過一個“Accept”報文頭屬性告訴服務端 客戶端接受什么類型的響應。?
如下報文頭相當于告訴服務端,俺客戶端能夠接受的響應類型僅為純文本數據啊,你丫別發其它什么圖片啊,視頻啊過來,那樣我會歇菜的~~~
[javascript]?view plain?copy
Accept屬性的值可以為一個或多個MIME類型的值(描述消息內容類型的因特網標準, 消息能包含文本、圖像、音頻、視頻以及其他應用程序專用的數據)
cookie
客戶端的Cookie就是通過這個報文頭屬性傳給服務端的哦!如下所示:
[javascript]?view plain?copy
服務端是怎么知道客戶端的多個請求是隸屬于一個Session呢?注意到后臺的那個jsessionid = 5F4771183629C9834F8382E23木有?原來就是通過HTTP請求報文頭的Cookie屬性的jsessionid的值關聯起來的!(當然也可以通過重寫URL的方式將會話ID附帶在每個URL的后面哦)。
Referer
表示這個請求是從哪個URL過來的,假如你通過google搜索出一個商家的廣告頁面,你對這個廣告頁面感興趣,鼠標一點發送一個請求報文到商家的網站,這個請求報文的Referer報文頭屬性值就是http://www.google.com。
Cache-Control
對緩存進行控制,如一個請求希望響應返回的內容在客戶端要被緩存一年,或不希望被緩存就可以通過這個報文頭達到目的。
?
HTTP響應報文
HTTP的響應報文也由三部分組成(響應行+響應頭+響應體)
?
響應行:
①報文協議及版本;?
②狀態碼及狀態描述;
響應頭:
③響應報文頭,也是由多個屬性組成;
響應體:
④響應報文體,即我們真正要的“干貨”
響應狀態碼?
和請求報文相比,響應報文多了一個“響應狀態碼”,它以“清晰明確”的語言告訴客戶端本次請求的處理結果。?
HTTP的響應狀態碼由5段組成:
- 1xx 消息,一般是告訴客戶端,請求已經收到了,正在處理,別急...
- 2xx 處理成功,一般表示:請求收悉、我明白你要的、請求已受理、已經處理完成等信息.
- 3xx 重定向到其它地方。它讓客戶端再發起一個請求以完成整個處理。
- 4xx 處理發生錯誤,責任在客戶端,如客戶端的請求一個不存在的資源,客戶端未被授權,禁止訪問等。
- 5xx 處理發生錯誤,責任在服務端,如服務端拋出異常,路由出錯,HTTP版本不支持等。
以下是幾個常見的狀態碼:?
200 OK?
你最希望看到的,即處理成功!?
303 See Other?
我把你redirect到其它的頁面,目標的URL通過響應報文頭的Location告訴你。
304 Not Modified?
告訴客戶端,你請求的這個資源至你上次取得后,并沒有更改,你直接用你本地的緩存吧,我很忙哦,你能不能少來煩我啊!?
404 Not Found?
你最不希望看到的,即找不到頁面。如你在google上找到一個頁面,點擊這個鏈接返回404,表示這個頁面已經被網站刪除了,google那邊的記錄只是美好的回憶。
500 Internal Server Error
看到這個錯誤,你就應該查查服務端的日志了,肯定拋出了一堆異常,別睡了,起來改BUG去吧!
◆200 (OK): 找到了該資源,并且一切正常。
◆302/307:臨時重定向,指出請求的文檔已被臨時移動到別處, 此文檔的新的url在location響應頭中給出
◆304 (NOT MODIFIED): 該資源在上次請求之后沒有任何修改。這通常用于瀏覽器的緩存機制。
◆401 (UNAUTHORIZED): 客戶端無權訪問該資源。這通常會使得瀏覽器要求用戶輸入用戶名和密碼,以登錄到服務器。
◆403 (FORBIDDEN): 客戶端未能獲得授權。這通常是在401之后輸入了不正確的用戶名或密碼。
◆404 (NOT FOUND): 在指定的位置不存在所申請的資源。
?
常見的HTTP響應報文頭屬性
Cache-Control?
響應輸出到客戶端后,服務端通過該報文頭屬告訴客戶端如何控制響應內容的緩存。
常見的取值有private、public、no-cache、max-age,no-store,默認為private。
private:? ?? ?? ?? ??客戶端可以緩存
public:? ?? ?? ?? ???客戶端和代理服務器都可緩存(前端的同學,可以認為public和private是一樣的)
max-age=xxx:???緩存的內容將在 xxx 秒后失效
no-cache: ? ?? ????需要使用對比緩存來驗證緩存數據
no-store: ? ?? ?? ??所有內容都不會緩存
默認為private,緩存時間為31536000秒(365天)也就是說,在365天內再次請求這條數據,都會直接獲取緩存數據庫中的數據,直接使用。
ETag?
一個代表響應服務端資源(如頁面)版本的報文頭屬性,如果某個服務端資源發生變化了,這個ETag就會相應發生變化。它是Cache-Control的有益補充,可以讓客戶端“更智能”地處理什么時候要從服務端取資源,什么時候可以直接從緩存中返回響應。
Location?
我們在JSP中讓頁面Redirect到一個某個A頁面中,其實是讓客戶端再發一個請求到A頁面,這個需要Redirect到的A頁面的URL,其實就是通過響應報文頭的Location屬性告知客戶端的,如下的報文頭屬性,將使客戶端redirect到iteye的首頁中:
[javascript]?view plain?copy
Set-Cookie?
服務端可以設置客戶端的Cookie,其原理就是通過這個響應報文頭屬性實現的:
[javascript]?view plain?copy
?
cookie機制:
客戶端請求服務器,如果服務器需要記錄該用戶狀態,就使用response向客戶端瀏覽器頒發一個Cookie。客戶端瀏覽器會把Cookie保存起來。當瀏覽器再請求該網站時,瀏覽器把請求的網址連同該Cookie一同提交給服務器。服務器檢查該Cookie,以此來辨認用戶狀態。服務器還可以根據需要修改Cookie的內容。
Cookie的maxAge決定著Cookie的有效期,單位為秒(Second)。Cookie中通過getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性。
如果maxAge屬性為正數,則表示該Cookie會在maxAge秒之后自動失效。
如果maxAge為負數,則表示該Cookie僅在本瀏覽器窗口以及本窗口打開的子窗口內有效,關閉窗口后該Cookie即失效。
如果maxAge為0,則表示刪除該Cookie。
?
Cookie并不提供修改、刪除操作。如果要修改某個Cookie,只需要新建一個同名的Cookie,添加到response中覆蓋原來的Cookie。
如果要刪除某個Cookie,只需要新建一個同名的Cookie,并將maxAge設置為0,并添加到response中覆蓋原來的Cookie。
Cookie cookie = new Cookie("username","helloweenvsfei");?? // 新建Cookie
cookie.setMaxAge(0);??? ?????? ??? ??? ?????? // 設置生命周期為0,不能為負數
response.addCookie(cookie); ?????? ??? ??? ??? // 必須執行這一句?輸出到客戶端
?
狀態消息
編輯
| 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 Found | 所請求的頁面已經臨時轉移至新的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 128。 |
| 403.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協議版本。 |
?
?
總結
以上是生活随笔為你收集整理的爬虫 spider02——详析http的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爬虫 spider01——基本概念
- 下一篇: 爬虫 spider05——使用httpc