全國(guó)咨詢(xún)/投訴熱線:400-618-4000

首頁(yè)技術(shù)文章正文

HTTP請(qǐng)求格式:請(qǐng)求行、請(qǐng)求頭詳細(xì)介紹【爬蟲(chóng)工程師必會(huì)】

更新時(shí)間:2021-05-04 來(lái)源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif

在網(wǎng)絡(luò)傳輸中HTTP協(xié)議非常重要,該協(xié)議規(guī)定了客戶(hù)端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)HTTP協(xié)議能保證計(jì)算機(jī)正確快速地傳輸超文本文檔,并確定了傳輸文檔中的哪部分,以及哪部分內(nèi)容首先顯示(如文本先于圖形)等。

根據(jù)HTTP協(xié)議的規(guī)定,客戶(hù)端發(fā)送一個(gè)HTTP請(qǐng)求到服務(wù)器的請(qǐng)求消息,由請(qǐng)求行,求頭部、空行以及請(qǐng)求數(shù)據(jù)四部分組成。如下所示為請(qǐng)求消息的一般格式。

 

1620122716875_01求情信息的一般格式.png

下面結(jié)合一個(gè)典型的HTTP請(qǐng)求示例,詳細(xì)介紹HTTP請(qǐng)求信息的各個(gè)組成部分。示例內(nèi)容如下:

GET https://www.baidu.com/content-search.xml HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: no-cors
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Cookie: BIDUPSID=12D4BD8584CA4E016E061A2A996EF369; PSTM=1620090350; BAIDUID=12D4BD8584CA4E01C03BA560AACCF2CE:FG=1; BD_UPN=12314753; H_PS_PSSID=33984_31660_33848_33759_33676_33607_33987_26350; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; __yjs_duid=1_1a965d65ab35181f7b7b98cce26990951620094330751; ab_sr=1.0.0_YjM2Y2YwOWI1MDU4ZDEzODMyZDZkNDBlODllOWEzZTdiMjk4YzgzYmUyM2ZjODA4MWM0MDExZTdiMDZlOTQwOWZhMWI0NGQ3NzNhODI2NTYzMWM1NzQ2ZDBmYjhkM2Q1; ispeed_lsm=0; H_PS_645EC=b177fVn0%2Brl2KczNrCfwRaWGfk3JZzrl7ScjgHBcxVvOkubEWrAPvQ6AXa4; BD_HOME=1; __guid=136081015.3970791550720005000.1620116535606.869; monitor_count=2; BA_HECTOR=8121a4848h8l0k0l6o1g9213e0r

 

1.請(qǐng)求行

上例中第1行為請(qǐng)求行,包含了請(qǐng)求方法、URL地址和協(xié)議版本,代碼如下:

GET https://www.baidu.com/content-search.xml HTTP/1.1

其中,GET是請(qǐng)求方法,https://www.baidu com/是URL地址,HTTP/1.1指定了協(xié)議版本。

不同的HTTP版本能夠使用的請(qǐng)求方法也不同,具體介紹如下:

(1)HTTP 0.9:只有基本的文本GET功能。

(2)HTTP 1.0:完善的請(qǐng)求/響應(yīng)模型,并將協(xié)議補(bǔ)充完整,定義了CET、POST和HEAD3種請(qǐng)求方法。

(3)HTTP 1.1:在1.0基礎(chǔ)上進(jìn)行更新,新增了5種請(qǐng)求方法: OPTIONS、 PUT、 DELETE、TRACE和CONNECT方法。

(4)HTTP 2.0(未普及):請(qǐng)求/響應(yīng)首部的定義基本沒(méi)有改變,只是所有首部鍵必須全部小寫(xiě),而且請(qǐng)求行要獨(dú)立為:method、:scheme、:host、 :path 等鍵值對(duì)。

不同請(qǐng)求方法的含義如下所示。


GET

請(qǐng)求指定的頁(yè)面信息,并返回實(shí)體主體

POST

向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(如提交表單或者上傳文件),數(shù)據(jù)被包含在請(qǐng)求體中。POST 請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和已有資源的修改。

HEAD

類(lèi)似于GET請(qǐng)求,只不過(guò)返回的響應(yīng)中沒(méi)有具體內(nèi)容,用于獲取報(bào)頭

PUT

這種請(qǐng)求方式下,從客戶(hù)端向服務(wù)器傳送的數(shù)據(jù)取代指定的文檔內(nèi)容

DELETE

請(qǐng)求服務(wù)器刪除指定的頁(yè)面

CONNECT

HTTP 1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器

OPTIONS

允許客戶(hù)端查看服務(wù)器的性能

TRACE

回顯服務(wù)器收到的請(qǐng)求,主要用于測(cè)試或診斷
 

其中,最常用的請(qǐng)求方法是GET和POST,兩者的區(qū)別在于:

(1)GET是從服務(wù)器上獲取指定頁(yè)面信息,POST是向服務(wù)器提交數(shù)據(jù)并獲取頁(yè)面信息。

(2)GET請(qǐng)求參數(shù)都顯示在URL上,服務(wù)器根據(jù)該請(qǐng)求所包含URL中的參數(shù)來(lái)產(chǎn)生響應(yīng)內(nèi)容。由于請(qǐng)求參數(shù)都暴露在外,所以安全性不高。

(3)POST請(qǐng)求參數(shù)在請(qǐng)求體當(dāng)中,消息長(zhǎng)度沒(méi)有限制而且采取隱式發(fā)送,通常用HTTP服務(wù)器提交量比較大的數(shù)據(jù)(如請(qǐng)求中包含許多參數(shù)或者文件上傳操作等)。POST請(qǐng)求的參數(shù)不在URL中,而在請(qǐng)求體中,在安全性方面,比GET請(qǐng)求更高。

 

1620121559661_http請(qǐng)求.png

2.請(qǐng)求報(bào)頭

請(qǐng)求行下是若干個(gè)請(qǐng)求報(bào)頭,下面介紹常 用的請(qǐng)求報(bào)頭及其含義。

(1)Host(主機(jī)和端口號(hào)) :指定被請(qǐng)求資源的Internet主機(jī)和端口號(hào),對(duì)應(yīng)網(wǎng)址URL的Web名稱(chēng)和端口號(hào),通常屬于URL的Host部分。

(2)Connection(連接類(lèi)型):表示客戶(hù)端與服務(wù)器的連接類(lèi)型。通常情況下,連接類(lèi)型的對(duì)話流程如下:

①Client發(fā)起一個(gè)包含Connection:keep-alive的請(qǐng)求(HTTP 1.1使用keep-alive為默認(rèn)值)

②Server收到請(qǐng)求后:

◆如果Server支持keep-alive, 回復(fù)一個(gè)包含Conection:keep-alive的響應(yīng),不關(guān)閉連接。

◆如果Server不支持keep-alive,回復(fù)一個(gè)包含Connection:close的響應(yīng),關(guān)閉連接。

③如果Client收到包含Connection:keep-alive的響應(yīng),則向同個(gè)連接發(fā)送下一個(gè)請(qǐng)求,直到一方主動(dòng)關(guān)閉連接。

注意: Connection:keep-alive 在很多情況下能夠重用連接,減少資源消耗,縮短響應(yīng)時(shí)間。例如,當(dāng)瀏覽器需要多個(gè)文件時(shí)(如一個(gè)HTML文件和多個(gè)Image文件),不需要每次都去請(qǐng)求建立連接

(3)Upgrade-Insecure-Requests(升級(jí)為HTTPS請(qǐng)求):表示升級(jí)不安全的請(qǐng)求,會(huì)在加載HTTP資源時(shí)自動(dòng)替換成HTTPS請(qǐng)求,讓瀏覽器不再顯示HTTPS頁(yè)面中的HTTP請(qǐng)求警報(bào)。

HTTPS是以安全為目標(biāo)的HTTP通道,所以在HTTPS承載的頁(yè)面上不允許出現(xiàn)HTTP請(qǐng)求,一且出現(xiàn)就會(huì)提示或報(bào)錯(cuò)。

(4)User-Agent(瀏覽器名稱(chēng)):標(biāo)識(shí)客戶(hù)端身份的名稱(chēng),通常頁(yè)面會(huì)根據(jù)不同的User-Agent信息自動(dòng)做出適配,甚至返回不同的響應(yīng)內(nèi)容。

(5)Accept(傳輸文件類(lèi)型):指瀏覽器或其他客戶(hù)端可以接受的MIME(Multipurpose Internet Mail Extensions,多用途因特網(wǎng)郵件擴(kuò)展)文件類(lèi)型,服務(wù)器可以根據(jù)它判斷并返回適當(dāng)?shù)奈募袷健?

Accept報(bào)頭的示例如下:

Accept: */*              //1表示什么都可以接收
Accept: image/gif        //表明客戶(hù)端希望接受GIF圖像格式的資源
Accept: text/html        //表明客戶(hù)端希望接受html文本
Accept: text/html,application/xhtml+xml;q=0.9,image/*;q=0.8 //表示瀏覽器支持的MIME類(lèi)型分別是html文本、xhtml和xml文檔、所有的圖像格式資深

其中:

◆q:表示權(quán)重系數(shù),范圍是0=<q<= 1。q值越大,請(qǐng)求越傾向于獲得其“;”之前的類(lèi)型表示的內(nèi)容。若沒(méi)有指定q值,則默認(rèn)為1,按從左到右排序;若被賦值為0,則表示瀏覽器不接受此內(nèi)容類(lèi)型。

◆text: 用于標(biāo)準(zhǔn)化地表示文本信息,文本信息可以是多種字符集和多種格式。

◆Aplication:用于傳輸應(yīng)用程序數(shù)據(jù)或者二進(jìn)制數(shù)據(jù)。

(6)Referer(頁(yè)面跳轉(zhuǎn)來(lái)源):表明產(chǎn)生請(qǐng)求的網(wǎng)頁(yè)來(lái)自于哪個(gè)URL。用戶(hù)是從該Referer頁(yè)面訪問(wèn)到當(dāng)前請(qǐng)求的頁(yè)面。這個(gè)屬性可以用來(lái)跟蹤Web請(qǐng)求來(lái)自哪個(gè)頁(yè)面,是從什么網(wǎng)站來(lái)的等。

有時(shí)下載某網(wǎng)站的圖片時(shí),需要對(duì)應(yīng)Referer,否則無(wú)法下載圖片,那是因?yàn)樽隽朔辣I鏈。原理就是根據(jù)Referer去判斷URL是否是本網(wǎng)站的地址,如果不是,則拒絕:如果是,就可以下載。

(7)Accept-Encoding(文件編解碼格式):指出瀏覽器可以接受的編碼方式。編碼方式不同于文件格式,其作用是壓縮文件并加速文件傳遞速度。瀏覽器在接收到Web響應(yīng)之后先解碼,然后再檢查文件格式,許多情形下可以減少大量的下載時(shí)間。例如:

Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0

如果有多個(gè)Enoding同時(shí)匹配,按照q值順序排列,本例中按順序支持gip、identity壓縮編碼,支持gzip的瀏覽器會(huì)返回經(jīng)過(guò)gzip編碼的HTML頁(yè)面。

如果請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)報(bào)頭,通常服務(wù)器假定客戶(hù)端不支持壓縮,直接返回文本。

(8)Accept-Language(語(yǔ)言種類(lèi)):指出瀏覽器可以接受的語(yǔ)言種類(lèi),如en或en-us指英語(yǔ),zh或zh--cn指中文,當(dāng)服務(wù)器能夠提供一種以上的語(yǔ)言版本時(shí)要用到。

如果目標(biāo)網(wǎng)站支持多個(gè)語(yǔ)種,可以使用這個(gè)信息來(lái)決定返回什么語(yǔ)言的網(wǎng)頁(yè)。

(9)Accepl-Charset (字符編碼) :指出瀏覽器可以接受的字符編碼。例如:

Accept-Charset:iso-8859-1,gb2312,utf-8


常用的字符編碼包括:

◆iso-8859-1:通常稱(chēng)為L(zhǎng)atin-1。Latin-1包括書(shū)寫(xiě)所有西方歐洲語(yǔ)言不可缺少的附加字符,英文瀏覽器的默認(rèn)值是iso-8859-1。

◆gb2312:標(biāo)準(zhǔn)簡(jiǎn)體中文字符集。

◆utf-8: Unicode的一種變長(zhǎng)字符編碼, 可以解決多種語(yǔ)言文本顯示問(wèn)題,從而實(shí)現(xiàn)應(yīng)用國(guó)際化和本地化。

如果在HTTP請(qǐng)求消息中沒(méi)有設(shè)置這個(gè)域,默認(rèn)情況下,客戶(hù)端可以接受任何字符集,返回的是網(wǎng)頁(yè)charset指定的編碼。

(10)Cookie(Cookie):瀏覽器用這個(gè)屬性向服務(wù)器發(fā)送Cookie。Cookie 是在瀏覽器中寄存的小型數(shù)據(jù)體,它可以記載和服務(wù)器相關(guān)的用戶(hù)信息,也可以用來(lái)實(shí)現(xiàn)模擬登錄。

(11)Conten-Type(POST數(shù)據(jù)類(lèi)型):指定POST請(qǐng)求中用來(lái)表示的內(nèi)容類(lèi)型。例如:

Content-Type=Text/XML; charset=gb2312:

上述示例指明了該請(qǐng)求的消息體中包含的是純文本的XML類(lèi)型的數(shù)據(jù),字符編碼采用gb2312。



猜你喜歡:

三種分布式爬蟲(chóng)策略的優(yōu)缺點(diǎn)

多線程爬蟲(chóng)是什么?多線程爬蟲(chóng)流程分析

Python爬蟲(chóng)可以做什么?

網(wǎng)絡(luò)爬蟲(chóng)獲取數(shù)據(jù)的5種方式

黑馬程序員Python+大數(shù)據(jù)培訓(xùn)課程

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!