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