1. 程式人生 > >http請求頭詳解and爬蟲

http請求頭詳解and爬蟲

爬蟲離不開http協議,在模擬請求的時候,請求頭偽裝的越像越好。我自己在這裡總結一下請求頭裡所有(如果有落下請留言提醒我)引數詳情,更多的側重爬蟲。

請求頭大小寫識別,首字母大寫。文中client,客戶端,瀏覽器為同義語。

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection

:keep-alive
Cookie:PHPSESSID=web2~qq1t4s3pab6e0ovmk1ulvqdff5; _ga=GA1.2.1252961155.1503028290; Hm_lvt_e23800c454aa573c0ccb16b52665ac26=1509010671,1509010711,1509065270,1509084318; Hm_lpvt_e23800c454aa573c0ccb16b52665ac26=1509084318
Host:segmentfault.com
Referer:https://www.baidu.com/link?url=lPVKa2fqWo1qlfGgwjNjkhFEJZr3VqzSO0dsmKslrXJd1a57vWbkb9NQupBDlfuS6FRBsuWJ6cpEUVvANfh2Q_&wd=&eqid=ce66e6c00000f9d70000000559ef0139

Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0

Cache-Control

指定了伺服器和客戶端在互動時遵循的快取機制,即是否要留下快取頁面資料。
一般在使用瀏覽器訪問時,都會在計算機本地留下快取頁面,相當於是瀏覽器中的頁面儲存和下載選項。但是爬蟲就是為了從網路上爬取資料,所以幾乎不會從快取中讀取資料。所以在設定的時候要側重從伺服器請求資料而非載入快取。

  • no-cache:客戶端告訴伺服器,自己不要讀取快取,要向伺服器發起請求
  • no-store:同時也是響應頭的引數,請求和響應都禁止快取,即不儲存
  • max-age=0:表示當訪問過此網頁後的多少秒內再次訪問,只加載快取,而不去伺服器請求,在爬蟲時一般就寫0秒

一般爬蟲就使用以上幾個引數,其他的引數都是接受快取的,所以就不列出了。

User-Agent

中文名使用者代理,伺服器從此處知道客戶端的 作業系統型別和版本,電腦CPU型別,瀏覽器種類版本,瀏覽器渲染引擎,等等。這是爬蟲當中最最重要的一個請求頭引數,所以一定要偽造,甚至多個。如果不進行偽造,而直接使用各種爬蟲框架中自定義的user-agent,很容易被封禁。舉例:

  • User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0
  • User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36

網上有很多的使用者代理大全,使用者代理大全越多越好,用以偽造多個請求頭。

Accept

指定客戶端可以接受的內容型別,比如文字,圖片,應用等等,內容的先後排序表示客戶端接收的先後次序,每種型別之間用逗號隔開。
其中,對於每一種內容型別,分號 ; 後面會加一個 q=0.6 這樣的 q 值,表示該種類型被客戶端喜歡接受的程度,如果沒有表示 q=1,數值越高,客戶端越喜歡這種型別。
爬蟲的時候,我一般會偽造若干,將想要找的文字,圖片放在前面,其他的放在後面,最後一定加上*/*;q=0.8。

  • 比如Accept: image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/*
  • text/xml,text/shtml:文字型別,斜槓後表示文件的型別,xml,或者shtml
  • application/xml,application/xhtml+xml:應用型別,後面表示文件型別,比如 flash動畫,excel表格等等
  • image/gif,image/x-xbitmap:圖片型別,表示接收何種型別的圖片
  • */*:表示接收任何型別,但是這一條一般寫在最後,表示優先接收前面規定的型別,然後再載入其他型別。

Accept-Language

客戶端可以接受的語言型別,引數值規範和 accept的很像。一般就接收中文和英文,有其他語言需求自行新增。比如:

  • Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4
  • zh-CN:中文簡體大陸?
  • zh:其他中文
  • en-US:英語美語
  • en:其他英語

Accept-Encoding

客戶端接收編碼型別,一些網路壓縮格式。我看了很多常見的請求頭,基本上都不變,就是如下:

  • Accept-Encoding: gzip, deflate, sdch。相對來說,deflate是一種過時的壓縮格式,現在常用的是gzip

Accept-Charset

指的是規定好伺服器處理表單資料所接受的字符集,也就是說,客戶端瀏覽器告訴伺服器自己的表單資料的字符集型別,用以正確接收。若沒有定義,則預設值為“unknown”。如果伺服器沒有包含此種字符集,就無法正確接收。一般情況下,在爬蟲時我不定義該屬性,如果定義,例子如下:

  • Accept-Charset:gb2312,gbk;q=0.7,utf-8;q=0.7,*;q=0.7

Referer

瀏覽器上次訪問的網頁url,uri。由於http協議的無記憶性,伺服器可從這裡瞭解到客戶端訪問的前後路徑,並做一些判斷,如果後一次訪問的 url 不能從前一次訪問的頁面上跳轉獲得,在一定程度上說明了請求頭有可能偽造。
我在爬蟲時,起始入口我會給一個隨意的百度搜索地址,然後,在爬取過程中,不斷將索引頁面的url新增在偽造請求頭中。

DNT

是 do not track 的縮寫,告訴伺服器,瀏覽器客戶端是否禁止第三方網站追蹤。這一條主要是用來保護瀏覽器使用者隱私的,通過此功能,使用者可以檢測到跨站跟蹤、cookie跟蹤等等。
在爬蟲時一般都是禁止的。數字1代表禁止追蹤,0代表接收追蹤,null代表空置,沒有規定。

Connection

請求頭的 header欄位指的是當 client 瀏覽器和 server 通訊時對於長連結如何處理。由於http請求是無記憶性的,長連線指的是在 client 和server 之間建立一個通道,方便兩者之間進行多次資料傳輸,而不用來回傳輸資料。有 close,keep-alive 等幾種賦值,close表示不想建立長連線在操作完成後關閉連結,而keep-alive 表示希望保持暢通來回傳輸資料。

此外,connection還可以存放一些自定義宣告,比如:

  • Connection: my-header, close, my-connection
  • My-Header: xxx

其中,my-header指的是當前訪問請求中使用的請求頭,close表示資料傳輸完畢後不保持暢通,關閉連結,my-connection具體含義還沒有查清楚。

在爬蟲時我一般都建立一個長連結。

Proxy-Connection

當使用代理伺服器的時候,這個就指明瞭代理伺服器是否使用長連結。但是,資料在從client 到代理伺服器,和從代理伺服器到被請求的伺服器之間如果存在資訊差異的話,會造成資訊請求不到,但是在大多數情況下,都還是能夠成立的。

Pragma

和 cache-control類似的一個欄位,但是具體什麼含義我還沒有查清楚,一般爬蟲時我都寫成 no-cache。

Cookie

同樣是一個比較關鍵的欄位,Cookie是 client 請求 伺服器時,伺服器會返回一個鍵值對樣的資料給瀏覽器,下一次瀏覽器再訪問這個域名下的網頁時,就需要攜帶這些鍵值對資料在 Cookie中,用來跟蹤瀏覽器使用者的訪問前後路徑。
在爬蟲時,我會根據前次訪問得到 cookie資料,然後新增到下一次的訪問請求頭中。

Upgrade-Insecure-Requests

自動將不安全的訪問請求轉換成安全的請求 request。賦值數字1表示可以,0就表示不可以。

Host

訪問的伺服器主機名,比如百度的 www.baidu.com。這個值在爬蟲時可以從 訪問的 URI 中獲得。

If-Modified-Since

只有當所請求的內容在指定的日期之後又經過修改才返回它,否則返回304。其目的是為了提高訪問效率。但是在爬蟲時,不設定這個值,而在增量爬取時才設定一個這樣的值,用以更新資訊。

Authorization

當客戶端接收到來自WEB伺服器的 WWW-Authenticate 響應時,該頭部來回應自己的身份驗證資訊給WEB伺服器。主要是授權驗證,確定符合伺服器的要求。這個在爬蟲時按需而定。

Range

瀏覽器告訴 WEB 伺服器自己想取物件的哪部分。這個在爬蟲時我接觸比較少,一般都是爬取整個頁面,然後再做分析處理。

還有一些別的屬性欄位,我再補充。
一個典型的適用於爬蟲爬取資料的偽造請求頭如下所示:

"Proxy-Connection": "keep-alive",
"Pragma": "no-cache",
"Cache-Control": "no-cache",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"DNT": "1",
"Accept-Encoding": "gzip, deflate, sdch",
"Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4",
"Referer": "https://www.baidu.com/s?wd=%BC%96%E7%A0%81&rsv_spt=1&rsv_iqid=0x9fcbc99a0000b5d7&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=0&oq=If-None-Match&inputT=7282&rsv_t=3001MlX2aUzape9perXDW%2FezcxiDTWU4Bt%2FciwbikdOLQHYY98rhPyD2LDNevDKyLLg2&rsv_pq=c4163a510000b68a&rsv_sug3=24&rsv_sug1=14&rsv_sug7=100&rsv_sug2=0&rsv_sug4=7283",
"Accept-Charset": "gb2312,gbk;q=0.7,utf-8;q=0.7,*;q=0.7",