解讀爬蟲中HTTP的祕密(基礎篇)

Python資料科學發表於2018-04-21

作者:xiaoyu

微信公眾號:Python資料科學

知乎:zhuanlan.zhihu.com/pypcfx


在學習爬蟲的過程中,相信大家對HTTP這個詞已經不陌生了,它好像從未離開過我們的視線。被迫所需,我們每次都要使用開發者工具去檢視請求頭響應頭,以及頭中的各個欄位,使用別人封裝好的模組填入資訊,敲幾行程式碼就解決了。面對簡單的爬取任務,我們也許根本不用管它是什麼,但可能等我們真正遇到問題的時候,卻無從下手。

認識並深刻理解HTTP對於爬蟲的實現過程是非常有幫助的。為了更好的讓大家理解爬蟲中的HTTP,博主將分為兩篇對HTTP進行講述,<基礎篇><高階篇>。本篇為基礎篇,將從以下幾個部分進行闡述。

  • 什麼是HTTP
  • 一個完整的HTTP請求過程
  • HTTP請求報文

什麼是HTTP?

<HTTP的介紹>

引自百度百科的權威回答:

超文字傳輸協議(HTTP,HyperText Transfer Protocol) 是網際網路上應用最為廣泛的一種網路協議。所有WWW檔案都必須遵守這個標準。設計HTTP最初的目的是為了提供一種釋出和接收HTML頁面的方法。 1960年美國人TedNelson構思了一種通過計算機處理文字資訊的方法,並稱之為超文字(hypertext),這成為了HTTP超文字傳輸協議標準架構的發展根基。TedNelson組織協調全球資訊網協會(World Wide Web Consortium)和網際網路工程工作小組(InternetEngineering Task Force )共同合作研究,最終釋出了一系列的RFC,其中著名的RFC 2616定義了HTTP 1.1。

HTTP協議是用於從WWW伺服器傳輸超文字到本地瀏覽器的傳輸協議。它可以使瀏覽器更加高效,使網路傳輸減少。它不僅保證計算機正確快速地傳輸超文字文件,還確定傳輸文件中的哪一部分,以及哪部分內容首先顯示(如文字先於圖形)等。

<HTTP的模型>

HTTP採用了瀏覽器/伺服器這種請求/響應模型,瀏覽器永遠是HTTP請求的發起者,伺服器為響應者。

解讀爬蟲中HTTP的祕密(基礎篇)

這樣在瀏覽器客戶端沒有發起請求的情況下,伺服器是不能主動推送訊息給客戶端的。

<HTTP的定位>

HTTP是一個應用層協議,是我們想從伺服器端獲取資訊的最直觀的請求。比如,在爬蟲中使用的<urllib模組><requests模組>等都是封裝了HTTP協議,作為一個HTTP客戶端實現了博文,圖片,視訊等資訊源的下載。

但是HTTP也不是直接就可以用的,它的請求是建立在一些底層協議的基礎上完成的。如TCP/IP協議棧中,HTTP需要TCP的三次握手連線成功後才能向伺服器發起請求。當然,如果是HTTPS的話,還需要TSLSSL安全層。

解讀爬蟲中HTTP的祕密(基礎篇)

一個完整的HTTP請求過程

既然HTTP協議需要建立在其它底層協議基礎上,我們來看看一個完整的HTTP請求是什麼樣的。

當我們點選一個連結或者輸入一個連結的時候,整個HTTP的請求過程就開始了,然後經過以下步驟得到最後的資訊,我們這裡簡單介紹一下前四個步驟,旨在瞭解HTTP。

解讀爬蟲中HTTP的祕密(基礎篇)

  • 域名解析:首先會搜尋各種本地DNS快取,如果沒有就會向DNS伺服器(網際網路提供商)發起域名解析,以獲取IP地址
  • 建立TCP連線:當獲取IP後,將建立套接字socket連線,也就是TCP的3次握手連線,預設埠號80
  • HTTP請求:一旦TCP連線成功後,瀏覽器/爬蟲就可以向伺服器發起HTTP請求報文了,報文內容包含請求行、請求頭部、請求主體
  • 伺服器響應:伺服器響應,並返回一個HTTP響應包(如果成功會返回狀態碼200)和請求的HTML程式碼。 上面的步驟<3><4>可以簡單的示意如下,更方便大家理解。其中,請求和響應都包含特定格式的資訊,具體我們接下來會繼續解讀。

解讀爬蟲中HTTP的祕密(基礎篇)

響應HTTP請求會返回響應狀態碼,根據狀態碼可以知道返回資訊的狀態。狀態碼規定如下:

1xx: 資訊響應類,表示接收到請求並且繼續處理
100——必須繼續發出請求
101——要求伺服器根據請求轉換HTTP協議版本
2xx: 處理成功響應類,表示動作被成功接收、理解和接受 200——交易成功
201——提示知道新檔案的URL
202——接受和處理、但處理未完成
203——返回資訊不確定或不完整
204——請求收到,但返回資訊為空
205——伺服器完成了請求,使用者代理必須復位當前已經瀏覽過的檔案
206——伺服器已經完成了部分使用者的GET請求
3xx: 重定向響應類,為了完成指定的動作,必須接受進一步處理
300——請求的資源可在多處得到
301——刪除請求資料
302——在其他地址發現了請求資料
303——建議客戶訪問其他URL或訪問方式
304——客戶端已經執行了GET,但檔案未變化
305——請求的資源必須從伺服器指定的地址得到
306——前一版本HTTP中使用的程式碼,現行版本中不再使用
307——申明請求的資源臨時性刪除
4xx: 客戶端錯誤,客戶請求包含語法錯誤或者是不能正確執行
400——錯誤請求,如語法錯誤
401——未授權
402——保留有效ChargeTo頭響應
403——禁止訪問
404——沒有發現檔案、查詢或URl
405——在Request-Line欄位定義的方法不允許
406——根據傳送的Accept,請求資源不可訪問
407——使用者必須首先在代理伺服器上得到授權
408——客戶端沒有在指定的時間內完成請求
409——對當前資源狀態,請求不能完成
410——伺服器不再有此資源且無進一步地址
411——伺服器拒絕使用者定義的Content-Length
412——一個或多個請求頭欄位在當前請求中錯誤
413——請求的資源大於伺服器允許的大小
414——請求的資源URL長於伺服器允許的長度
415——請求資源不支援請求專案格式
416——請求中包含Range請求頭欄位,在當前請求資源範圍內沒有range指示值,請求也不包含If-Range請求頭欄位
417——伺服器不滿足請求Expect頭欄位指定的期望值,如果是代理伺服器,可能是下一級伺服器不能滿足請求長。
5xx: 服務端錯誤,伺服器不能正確執行一個正確的請求
500——內部伺服器錯誤
501——未實現
502——閘道器錯誤

HTTP請求報文

相信你已經對HTTP的請求過程有了大致的瞭解了,下面我們來詳細介紹HTTP請求的報文資訊。 報文內容包含請求行、請求頭部、請求主體

解讀爬蟲中HTTP的祕密(基礎篇)

下面我們來看一下通過開發者工具請求www.baidu.com/網址擷取下來的HTTP請求報文內容,對比一下上面的標準格式。

解讀爬蟲中HTTP的祕密(基礎篇)

我們發現請求報文的格式與上面基本一致,正式我們想要的。那麼,接下來我們將要逐個的介紹以上各個資訊。

請求行

<GET>是HTTP的請求方式之一,HTTP/1.1協議中共定義了8種方法與伺服器互動,有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT,其中比較常用的是****方法了。

  • HEAD: 從伺服器得到除了請求體與GET請求一樣的響應
  • GET:通過URL獲取查詢資源資訊(爬蟲特定URL爬取)
  • POST:提交表單(爬蟲中的模擬登入)
  • PUT:上傳檔案(瀏覽器不支援)
  • DELETE:刪除
  • OPTIONS:返回伺服器對特定資源支援的HTTP請求方法
  • TRACE:返回伺服器收到的請求,用於測試或診斷 CONNECT:預留給管道連線方式的代理服務

GET請求方法後URL(這裡是/)和版本1.1,別忘了空格

請求頭

HTTP的頭域包括通用頭請求頭響應頭實體頭四部分。因為在爬蟲過程中,我們經常會提交headers請求頭資訊用於偽裝,所以我們這裡對請求頭著重講解一下。

請求頭是請求報文特有的,它向伺服器提交了一些額外的資訊,例如通過Accept欄位資訊,我們客戶端可以告訴伺服器我們接受一些什麼型別的資料。而我們其實可以把這些欄位資訊就當成**<鍵值對>**對待。

下面我們看看這些欄位都代表了什麼意思?

Accept

內容:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
含義:告訴瀏覽器我們接受MIME的型別

Accept-Encoding

內容:gzip, deflate, br
含義:如果有這個欄位,則代表客戶端支援壓縮將內容編碼,去掉後會支援任意編碼。
注意:爬蟲時一般不要把它加上,博主最開始就是不懂全都複製過來,結果因為這個就是不好使卡住好長時間。

Accept-Lanague

內容:zh-CN,zh;q=0.9
含義:告訴伺服器能夠接受的語言,沒有則代表任何語言

Connection

內容:keep-alive
含義:告訴伺服器需要持久有效的連線狀態(HTTP1.1預設會進行持久連線)

Host

內容:www.baidu.com
含義:客戶端指定自己想訪問的web伺服器域名/IP地址和埠號

Cache-control

內容:max-age=0 含義:(引自百度百科)

Cache-Control 是最重要的規則。這個欄位用於指定所有快取機制在整個請求/響應鏈中必須服從的指令。這些指令指定用於阻止快取對請求或響應造成不利干擾的行為。這些指令通常覆蓋預設快取演算法。快取指令是單向的,即請求中存在一個指令並不意味著響應中將存在同一個指令。

網頁的快取是由HTTP訊息頭中的“Cache-control”來控制的,常見的取值有private、no-cache、max-age、must-revalidate等,預設為private。

但是HTTP請求和響應的Cache-Control是不完全一樣的。 常見的請求Cache-Control取值有<no-cache>, <no-store>, <max-age>, <max-stale>, <min-fresh>, <only-if-cached>

響應的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,表示每次請求會訪問伺服器,通過Last-Modified來判斷檔案是否被修改,如果被修改,返回狀態碼200並得到最新檔案,否則將返回304狀態碼並讀取快取檔案。

<2>max-age>0 表示會直接從瀏覽器提取快取。

<3>no-cache 表示不會在瀏覽器快取進行提取,而是強制的向伺服器發出請求,這樣可以保證客戶端能夠收到最權威的回應。

<4>no-store 所有內容都不會被快取到快取或Internet臨時檔案中。

Upgrade-Insecure-Requests

內容:1
含義:表示瀏覽器/爬蟲可以處理HTTPS協議,並能自動升級請求從HTTP到HTTPS。

User-Agent

內容:Mozilla/5.0 (Windows NT 6.1; WOW64) ..Safari/537.36
含義:(這個是爬蟲中最常用了)用於偽裝成瀏覽器身份請求網頁。它的意思自然就是表示瀏覽器的身份,說明是用的哪種瀏覽器進行的操作。

Cookies

含義:(這個也是爬蟲中很重要的了,通常用於模擬登入) Cookies是用於維持服務端的會話狀態,由伺服器端寫入,然後在後續請求中,供伺服器讀取使用。

以上就是本例中出現的所有欄位資訊內容。當然,還有其它一些常用欄位資訊,這裡也一起說明一下。

其它請求頭欄位資訊

Referer

含義:(這個也是爬蟲常用到的,防盜鏈) 客戶端通過當前URL代表的頁面出發訪問我們請求的頁面。爬蟲中,一般我們只要把它設定成請求的網頁連結就好了。

Accept-Charset

含義:(這個也是爬蟲常用到的) 表示瀏覽器可接受的字符集,可以是utf-8gbk

If-Modified-Since

內容:Thu, 10 Apr 2008 09:14:42 GMT 含義:請求的內容在指定日期以後一旦被修改就被返回物件內容,否則返回“Not Modified”

Pragma

含義

Pragma頭域用來包含實現特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1協議中,它的含義和Cache-Control:no-cache相同。

Range

含義:告訴瀏覽器自己想取物件的哪個部分。例如,Range: bytes=1173546

總結

本篇內容介紹了HTTP的基本概念,主要包含了以下幾點:

  • 什麼是HTTP

  • HTTP的模型、作用和定位

  • 一個完整的HTTP請求過程

  • HTTP請求頭資訊

  • HTTP請求頭常用欄位資訊

下篇將會分享一些HTTP的高階內容,包括如下內容:

  • Cookie
  • Sesssion
  • HTTPS 最後,歡迎大家給我留言,我們可以一起討論,共同學習爬蟲技術。博主也是不斷的學習中,並會在學習中持續分享。

微信公眾號:Python資料科學

知乎:zhuanlan.zhihu.com/pypcfx

解讀爬蟲中HTTP的祕密(基礎篇)

相關文章