您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何解讀爬蟲中HTTP的基礎(chǔ)知識,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
什么是HTTP?
<HTTP的介紹>
引自百度百科的權(quán)威回答:
超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol) 是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有WWW文件都必須遵守這個標(biāo)準(zhǔn)。設(shè)計HTTP最初的目的是為了提供一種發(fā)布和接收HTML頁面的方法。
1960年美國人Ted Nelson構(gòu)思了一種通過計算機處理文本信息的方法,并稱之為超文本(hypertext),這成為了HTTP超文本傳輸協(xié)議標(biāo)準(zhǔn)架構(gòu)的發(fā)展根基。Ted Nelson組織協(xié)調(diào)萬維網(wǎng)協(xié)會(World Wide Web Consortium)和互聯(lián)網(wǎng)工程工作小組(Internet Engineering Task Force )共同合作研究,最終發(fā)布了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。
HTTP協(xié)議是用于從WWW服務(wù)器傳輸超文本到本地瀏覽器的傳輸協(xié)議。它可以使瀏覽器更加高效,使網(wǎng)絡(luò)傳輸減少。它不僅保證計算機正確快速地傳輸超文本文檔,還確定傳輸文檔中的哪一部分,以及哪部分內(nèi)容首先顯示(如文本先于圖形)等。
<HTTP的模型>
HTTP采用了瀏覽器/服務(wù)器這種請求/響應(yīng)模型,瀏覽器永遠(yuǎn)是HTTP請求的發(fā)起者,服務(wù)器為響應(yīng)者。
這樣在瀏覽器客戶端沒有發(fā)起請求的情況下,服務(wù)器是不能主動推送消息給客戶端的。
<HTTP的定位>
HTTP是一個應(yīng)用層協(xié)議,是我們想從服務(wù)器端獲取信息的最直觀的請求。比如,在爬蟲中使用的<urllib模塊>,<requests模塊>等都是封裝了HTTP協(xié)議,作為一個HTTP客戶端實現(xiàn)了博文,圖片,視頻等信息源的下載。
但是HTTP也不是直接就可以用的,它的請求是建立在一些底層協(xié)議的基礎(chǔ)上完成的。如TCP/IP協(xié)議棧中,HTTP需要TCP的三次握手連接成功后才能向服務(wù)器發(fā)起請求。當(dāng)然,如果是HTTPS的話,還需要TSL和SSL安全層。
一個完整的HTTP請求過程
既然HTTP協(xié)議需要建立在其它底層協(xié)議基礎(chǔ)上,我們來看看一個完整的HTTP請求是什么樣的。
當(dāng)我們點擊一個鏈接或者輸入一個鏈接的時候,整個HTTP的請求過程就開始了,然后經(jīng)過以下步驟得到***的信息,我們這里簡單介紹一下前四個步驟,旨在了解HTTP。
<1> 域名解析
首先會搜索各種本地DNS緩存,如果沒有就會向DNS服務(wù)器(互聯(lián)網(wǎng)提供商)發(fā)起域名解析,以獲取IP地址。
<2> 建立TCP連接
當(dāng)獲取IP后,將創(chuàng)建套接字socket連接,也就是TCP的3次握手連接,默認(rèn)端口號80。
<3> HTTP請求
一旦TCP連接成功后,瀏覽器/爬蟲就可以向服務(wù)器發(fā)起HTTP請求報文了,報文內(nèi)容包含請求行、請求頭部、請求主體。
<4> 服務(wù)器響應(yīng)
服務(wù)器響應(yīng),并返回一個HTTP響應(yīng)包(如果成功會返回狀態(tài)碼200)和請求的HTML代碼。
上面的步驟<3>和<4>可以簡單的示意如下,更方便大家理解。其中,請求和響應(yīng)都包含特定格式的信息,具體我們接下來會繼續(xù)解讀。
響應(yīng)HTTP請求會返回響應(yīng)狀態(tài)碼,根據(jù)狀態(tài)碼可以知道返回信息的狀態(tài)。狀態(tài)碼規(guī)定如下:
1xx: 信息響應(yīng)類,表示接收到請求并且繼續(xù)處理
100——必須繼續(xù)發(fā)出請求
101——要求服務(wù)器根據(jù)請求轉(zhuǎn)換HTTP協(xié)議版本
2xx: 處理成功響應(yīng)類,表示動作被成功接收、理解和接受
200——交易成功
201——提示知道新文件的URL
202——接受和處理、但處理未完成
203——返回信息不確定或不完整
204——請求收到,但返回信息為空
205——服務(wù)器完成了請求,用戶代理必須復(fù)位當(dāng)前已經(jīng)瀏覽過的文件
206——服務(wù)器已經(jīng)完成了部分用戶的GET請求
3xx: 重定向響應(yīng)類,為了完成指定的動作,必須接受進(jìn)一步處理
300——請求的資源可在多處得到
301——刪除請求數(shù)據(jù)
302——在其他地址發(fā)現(xiàn)了請求數(shù)據(jù)
303——建議客戶訪問其他URL或訪問方式
304——客戶端已經(jīng)執(zhí)行了GET,但文件未變化
305——請求的資源必須從服務(wù)器指定的地址得到
306——前一版本HTTP中使用的代碼,現(xiàn)行版本中不再使用
307——申明請求的資源臨時性刪除
4xx: 客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執(zhí)行
400——錯誤請求,如語法錯誤
401——未授權(quán)
402——保留有效ChargeTo頭響應(yīng)
403——禁止訪問
404——沒有發(fā)現(xiàn)文件、查詢或URl
405——在Request-Line字段定義的方法不允許
406——根據(jù)發(fā)送的Accept,請求資源不可訪問
407——用戶必須首先在代理服務(wù)器上得到授權(quán)
408——客戶端沒有在指定的時間內(nèi)完成請求
409——對當(dāng)前資源狀態(tài),請求不能完成
410——服務(wù)器不再有此資源且無進(jìn)一步地址
411——服務(wù)器拒絕用戶定義的Content-Length
412——一個或多個請求頭字段在當(dāng)前請求中錯誤
413——請求的資源大于服務(wù)器允許的大小
414——請求的資源URL長于服務(wù)器允許的長度
415——請求資源不支持請求項目格式
416——請求中包含Range請求頭字段,在當(dāng)前請求資源范圍內(nèi)沒有range指示值,請求也不包含If-Range請求頭字段
417——服務(wù)器不滿足請求Expect頭字段指定的期望值,如果是代理服務(wù)器,可能是下一級服務(wù)器不能滿足請求長。
5xx: 服務(wù)端錯誤,服務(wù)器不能正確執(zhí)行一個正確的請求
500——內(nèi)部服務(wù)器錯誤
501——未實現(xiàn)
502——網(wǎng)關(guān)錯誤
HTTP請求報文
相信你已經(jīng)對HTTP的請求過程有了大致的了解了,下面我們來詳細(xì)介紹HTTP請求的報文信息。
報文內(nèi)容包含請求行、請求頭部、請求主體。
下面我們來看一下通過開發(fā)者工具請求<https://www.baidu.com/>網(wǎng)址截取下來的HTTP請求報文內(nèi)容,對比一下上面的標(biāo)準(zhǔn)格式。
我們發(fā)現(xiàn)請求報文的格式與上面基本一致,正式我們想要的。那么,接下來我們將要逐個的介紹以上各個信息。
請求行
<GET>是HTTP的請求方式之一,HTTP/1.1協(xié)議中共定義了8種方法與服務(wù)器交互,有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT,其中比較常用的是<GET>和<POST>方法了。
HEAD: 從服務(wù)器得到除了請求體與GET請求一樣的響應(yīng)
GET:通過URL獲取查詢資源信息(爬蟲特定URL爬?。?/p>
POST:提交表單(爬蟲中的模擬登錄)
PUT:上傳文件(瀏覽器不支持)
DELETE:刪除
OPTIONS:返回服務(wù)器對特定資源支持的HTTP請求方法
TRACE:返回服務(wù)器收到的請求,用于測試或診斷
CONNECT:預(yù)留給管道連接方式的代理服務(wù)
GET請求方法后URL(這里是/)和版本1.1,別忘了空格。
請求頭
HTTP的頭域包括通用頭、請求頭、響應(yīng)頭和實體頭四部分。因為在爬蟲過程中,我們經(jīng)常會提交headers請求頭信息用于偽裝,所以我們這里對請求頭著重講解一下。
請求頭是請求報文特有的,它向服務(wù)器提交了一些額外的信息,例如通過Accept字段信息,我們客戶端可以告訴服務(wù)器我們接受一些什么類型的數(shù)據(jù)。而我們其實可以把這些字段信息就當(dāng)成<鍵值對>對待。
下面我們看看這些字段都代表了什么意思?
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
含義:告訴瀏覽器我們接受MIME的類型
Accept-Encoding:gzip, deflate, br
含義:如果有這個字段,則代表客戶端支持壓縮將內(nèi)容編碼,去掉后會支持任意編碼。
注意:爬蟲時一般不要把它加上,博主最開始就是不懂全都復(fù)制過來,結(jié)果因為這個就是不好使卡住好長時間。
Accept-Lanague:zh-CN,zh;q=0.9
含義:告訴服務(wù)器能夠接受的語言,沒有則代表任何語言
Connection:keep-alive
含義:告訴服務(wù)器需要持久有效的連接狀態(tài)(HTTP1.1默認(rèn)會進(jìn)行持久連接)
Host:www.baidu.com
含義:客戶端指定自己想訪問的web服務(wù)器域名/IP地址和端口號
Cache-control:max-age=0
含義:(引自百度百科)
Cache-Control 是最重要的規(guī)則。這個字段用于指定所有緩存機制在整個請求/響應(yīng)鏈中必須服從的指令。這些指令指定用于阻止緩存對請求或響應(yīng)造成不利干擾的行為。這些指令通常覆蓋默認(rèn)緩存算法。緩存指令是單向的,即請求中存在一個指令并不意味著響應(yīng)中將存在同一個指令。
網(wǎng)頁的緩存是由HTTP消息頭中的“Cache-control”來控制的,常見的取值有private、no-cache、max-age、must-revalidate等,默認(rèn)為private。
但是HTTP請求和響應(yīng)的Cache-Control是不完全一樣的。
常見的請求Cache-Control取值有<no-cache>, <no-store>, <max-age>, <max-stale>, <min-fresh>, <only-if-cached>。
響應(yīng)的Cache-Control取值有<public>, <private>, <no-cache>, <no- store>, <no-transform>, <must-revalidate>, <proxy-revalidate>, <max-age>。
我們這里主要介紹請求時的常見Cache-Control取值。
<1>max-age<=0
本例中使用max-age=0,表示每次請求會訪問服務(wù)器,通過Last-Modified來判斷文件是否被修改,如果被修改,返回狀態(tài)碼200并得到***文件,否則將返回304狀態(tài)碼并讀取緩存文件。
<2>max-age>0
表示會直接從瀏覽器提取緩存。
<3>no-cache
表示不會在瀏覽器緩存進(jìn)行提取,而是強制的向服務(wù)器發(fā)出請求,這樣可以保證客戶端能夠收到最權(quán)威的回應(yīng)。
<4>no-store
所有內(nèi)容都不會被緩存到緩存或Internet臨時文件中。
Upgrade-Insecure-Requests:1
含義:表示瀏覽器/爬蟲可以處理HTTPS協(xié)議,并能自動升級請求從HTTP到HTTPS。
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) ..Safari/537.36
含義:(這個是爬蟲中最常用了)用于偽裝成瀏覽器身份請求網(wǎng)頁。它的意思自然就是表示瀏覽器的身份,說明是用的哪種瀏覽器進(jìn)行的操作。
Cookies:
含義:(這個也是爬蟲中很重要的了,通常用于模擬登錄)
Cookies是用于維持服務(wù)端的會話狀態(tài),由服務(wù)器端寫入,然后在后續(xù)請求中,供服務(wù)器讀取使用。
以上就是本例中出現(xiàn)的所有字段信息內(nèi)容。當(dāng)然,還有其它一些常用字段信息,這里也一起說明一下。
其它請求頭字段信息
Referer:
含義:(這個也是爬蟲常用到的,防盜鏈)
客戶端通過當(dāng)前URL代表的頁面出發(fā)訪問我們請求的頁面。爬蟲中,一般我們只要把它設(shè)置成請求的網(wǎng)頁鏈接就好了。
Accept-Charset:
含義:(這個也是爬蟲常用到的)
表示瀏覽器可接受的字符集,可以是utf-8,gbk等
If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT
含義:請求的內(nèi)容在指定日期以后一旦被修改就被返回對象內(nèi)容,否則返回“Not Modified”
Pragma:
含義:
Pragma頭域用來包含實現(xiàn)特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協(xié)議中,它的含義和Cache-Control:no-cache相同。
Range:
含義:告訴瀏覽器自己想取對象的哪個部分。例如,Range: bytes=1173546
關(guān)于如何解讀爬蟲中HTTP的基礎(chǔ)知識就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。