解讀爬蟲中HTTP的祕密(高階篇)

做者:xiaoyuweb

微信公衆號:Python數據科學算法

知乎:Python數據分析師瀏覽器


上期回顧:解讀爬蟲中HTTP的祕密(基礎篇)緩存

上一篇咱們介紹了爬蟲中HTTP的基礎內容,相信看過的朋友們應該對HTTP已經有個初步的認識了。本篇博主將分享一些HTTP的高級內容,以及在爬蟲中的應用,讓你們更深刻理解。這些內容包括:安全

  • Cookie解讀
  • Session解讀
  • HTTPs解讀

Cookie解讀

1.什麼是Cookie?

Cookie原意是"小甜點"的意思,可是在互聯網上被用做儲存在用戶本地終端上的數據。 百度百科是這麼解釋的:服務器

Cookie,有時也用其複數形式 Cookies,指某些網站爲了辨別用戶身份、進行 session 跟蹤而儲存在用戶本地終端上的數據(一般通過加密)。定義於 RFC2109 和 2965 中的都已廢棄,最新取代的規範是 RFC6265。(能夠叫作瀏覽器緩存)微信

2.爲何要使用Cookie?

首先,須要明確一個很重要的概念:HTTP是一個無狀態的協議。網絡

什麼意思呢?舉一個簡單的例子來理解一下。session

<應用一>dom

好比,咱們網上購物的時候,瀏覽了幾個網頁,選了幾樣商品放入了購物車。可是因爲HTTP的無狀態特色,當咱們結帳的時候服務器並不知道操做的用戶是誰,即沒法記錄上下文的信息,這嚴重的妨礙了web應用程序交互式的操做。

爲了解決HTTP的無狀態的問題,Cookie就應運而生了。Cookie繞開了HTTP的無狀態性,提供了一種"額外手段"維護了用戶跟服務器會話中的狀態。說白了,Cookie就是一小段數據儲存在本地,記錄並標識了用戶身份,以便服務器辨認。這其實至關於讓一個失憶的人今後有了記憶。所以,不管當咱們購買幾回商品,退貨,結帳等,服務器都能經過這個標識來判斷出你是誰。

還有一個常見的例子,就是登陸

<應用二>

當咱們登陸某個網站輸入用戶名和密碼後,通常瀏覽器會提示是"是否保存密碼"。咱們一般會勾選保存,那麼這樣帶來的好處就是在之後的一段時間咱們訪問該網站都會自動登陸而沒必要每次都去敲用戶名和密碼了。

也正是這個緣由,簡化了爬蟲中模擬登陸的問題,每次登陸只要post一個Cookie信息就能夠了,而避免了每次都post登陸信息。固然,這隻針對一部分網站而言,一些複雜的網站會按期的變換一些算法,使得Cookie頻繁的失效,這時候就須要post登陸信息了或者模擬找到算法的規律。

關於爬蟲模擬登陸的詳細內容後續後專門開一篇和你們分享。

3.Cookie的分類

Cookie有兩種類型:持久化Cookie非持久化Cookie

  • 持久化Cookie:表示Cookie會保存到本地磁盤上,關閉瀏覽器再次打開,Cookie依然有效直到設置的expire時間。

  • **非持久化Cookie:**表示Cookie會在本地內存中,生命週期會受瀏覽器開關狀態影響,只要瀏覽器關閉,Cookie則失效。

4.HTTP+Cookie的交互過程

下面是HTTP請求中使用Cookie所實現的整個web交互過程

博主以一個訪問豆瓣的實際例子做爲上述過程的具體說明和描述。

<1>步驟1的請求頭

看到請求頭裏面沒有Cookie,只是常規的頭域字段信息。

<2>步驟2/3的響應頭

服務器根據 POST請求(用戶名密碼等)生成一個Cookie,並經過響應頭的 set-Cookie字段返回此Cookie信息。

<3>步驟5的請求頭

再一次刷新頁面的請求頭中就有了獲取Cookie信息。

<4>步驟7的響應頭

第二次的響應頭 無set-Cookie字段信息,由於服務器已經辨別了這個用戶剛剛提交的Cookie信息。

5.Cookie的格式和屬性

格式:

  • 客戶端發送Cookie-鍵值對:Cookie:key1=value1; key2=value2; key3=value3
  • 服務器響應Cookie:Set-Cookie: name=value;expires=date;path=path;domain=domain_name;secure

屬性:

  • name:爲一個Cookie的名稱
  • domain:爲能夠訪問此Cookie的域名,該域名可使多個web服務器共享Cookie
  • path:表示Cookie所在目錄「/」表示根目錄。
  • expires/max-age:爲Cookie的生命週期。若設置該值,則到此時間Cookie會失效。若沒有設置該值,默認與session一塊兒失效。瀏覽器關閉,Cookie失效。
  • secure:布爾值,指定Cookie的傳輸方式默認是不安全的HTTP鏈接
  • http:Cookie的httponly屬性,若此屬性爲true,則只能在http的請求頭中攜帶Cookie信息。

Session解讀

1.什麼是Session?

百度百科是這麼解釋的:

Session: 在計算機中,尤爲是在網絡應用中,稱爲「會話控制」。Session對象存儲特定用戶會話所需的屬性及配置信息。這樣,當用戶在應用程序的 Web 頁之間跳轉時,存儲在 Session對象中的變量將不會丟失,而是在整個用戶會話中一直存在下去。當用戶請求來自應用程序的 Web 頁時,若是該用戶尚未會話,則 Web服務器將自動建立一個 Session 對象。當會話過時或被放棄後,服務器將終止該會話。

2.爲何要使用Session?

一樣是由於HTTP是一個無狀態協議SessionCookie的存在都是爲了解決這個問題的。

因爲服務器自己並不會維持用戶的上下文,所以爲了實現會話的跟蹤,不得不想出一種辦法。 Session正是一種保存上下文的機制,對於每個用戶來說,用戶所產生的變量值都保存在了服務器端,這樣就使得整個會話都銜接的上,而每一個用戶有本身獨一無二的ID,咱們叫作SessionID

3.Session和Cookie有什麼聯繫?

這個要從SessionID提及。咱們上面提到服務器會每一個用戶建立一個SessionID,那麼咱們該如何使用它呢?

SessionID有以下幾種使用方式:

<1>Cookie

這是咱們最經常使用的方式,Cookie至關於一個SessionID的高級應用,是SessionID的載體或者容器。咱們說Cookie能夠用來識別用戶身份,也是由於SessionID的緣故。

所以,能夠說Session是服務端的解決方案,實現了web的會話跟蹤,而Cookie是客戶端的解決方案,實現了跟蹤過程的用戶識別。

Session是真正解決HTTP無狀態的方案,而Cookie只是實現了Session過程當中的SessionID方式。

<2>URL重寫

Cookie的使用給用戶帶來了極大的方便,以及很好的用戶體驗。可是Cookie存在着一些安全問題,Cookie儲存在本地會很大程度暴露用戶信息。所以,用戶能夠選擇禁用Cookie。

那麼另外一種實現SessionID的方式就是URL重寫URL重寫就是把SessionID附加在URL裏,能夠做爲URL路徑附加信息或者查詢字符串附加在URL後面。

就是說用戶全部的請求的URL中都要有sesssionID這個東西,不然沒法保持會話的持久狀態。

<3>表單隱藏字段

服務器會修改表單,設置一個SessionID的隱藏字段,用戶須要將SessionID填寫到隱藏字段中提交表單,以讓服務器知道用戶身份。

隱藏字段也是爬蟲中的反爬策略之一,若是咱們爬蟲提交的表單沒有填寫隱藏字段,那麼服務器會認爲這是一種爬蟲行爲而禁掉,或者提交的內容不正確也可能形成一樣的後果。所以,每次爬取前有必要查看一下是否存在隱藏字段。固然,關於隱藏字段還有更復雜的玩法這裏就不詳細介紹了。

4.Session的關閉

<關閉瀏覽器>

有時候咱們可能會誤覺得關閉了瀏覽器,Session就消失了。其實,Session並無消失,若是消失,消失的也是Cookie(若是儲存在內存的話)。

Session是儲存在服務端的,注意是服務端。而服務端是不會知道瀏覽器何時關閉了的,可是服務端又不能一直開着Session,那樣會損耗服務器資源。所以,爲了解決這個問題,**服務端通常會設置Session超時,經過檢測用戶活動狀態來判斷是否超時。**若是超時,那麼整個會話Session才真正消失,否則仍是會開着直到超時。

若是Cookie是本地儲存在磁盤上的,在咱們關閉瀏覽器的很短一段時間內再次打開瀏覽器,仍是會回到剛纔那個Session會話。可是若是Cookie儲存在內存中,再次打開時瀏覽器已經忘記了Cookie,那麼就沒法和剛纔的會話鏈接上了。

結論是:關閉瀏覽器並不會使服務端Session對象消失。

<註銷>

註銷和關閉瀏覽器有着本質的區別,註銷實際上會使Session對象消失。就好比咱們在網頁上點擊註銷同樣,用戶信息就都被清空了。若是須要鏈接Session,須要從新建立Session。

結論是:註銷會使服務端Session對象消失。

HTTPs解讀

1.什麼是HTTPs?

依舊百度百科一下:

HTTPS(全稱:Hyper Text Transfer Protocol over Secure SocketLayer),是以安全爲目標的HTTP通道,簡單講是HTTP的安全版。即HTTP下加入SSL層,HTTPS的安全基礎是SSL,所以加密的詳細內容就須要SSL。 它是一個URIscheme(抽象標識符體系),句法類同http:體系。用於安全的HTTP數據傳輸。https:URL代表它使用了HTTP,但HTTPS存在不一樣於HTTP的默認端口及一個加密/身份驗證層(在HTTPTCP之間)。這個系統的最初研發由網景公司(Netscape)進行,並內置於其瀏覽器NetscapeNavigator中,提供了身份驗證與加密通信方法。如今它被普遍用於萬維網上安全敏感的通信,例如交易支付方面。

2.HTTPs與HTTP的區別

超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息。HTTP協議以明文方式發送內容,不提供任何方式的數據加密,若是攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就能夠直接讀懂其中的信息,所以HTTP協議不適合傳輸一些敏感信息,好比信用卡號、密碼等。

爲了解決HTTP協議的這一缺陷,須要使用另外一種協議:安全套接字層超文本傳輸協議HTTPS。爲了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議SSL依靠證書來驗證服務器的身份,併爲瀏覽器和服務器之間的通訊加密。

HTTPS和HTTP的區別主要爲如下四點:

1、https協議須要到ca申請證書,通常免費證書不多,須要交費。

2、http是超文本傳輸協議,信息是明文傳輸,https 則是具備安全性的ssl加密傳輸協議

3、http和https使用的是徹底不一樣的鏈接方式,用的端口也不同,前者是80,後者是443

4、http的鏈接很簡單,是無狀態的;HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。

3.HTTPs對爬蟲的影響

乍一看感受HTTPs有點像反爬的手段,經過上面的瞭解,咱們發現HTTPs是對服務器端的驗證,經過CA證書保證了咱們訪問的網站是有身份的,而非其餘假網站。相反,咱們爬蟲模擬的是客戶端,並不受HTTPs的限制。

所以,HTTPs不影響咱們爬蟲。

可是,咱們在爬蟲的過程仍然也會遇到過相似SSL不經過之類的錯誤。好比,博主之前用requests訪問HTTPs的時候遇到過這樣的坑,但最後究其緣由是同時打開了fiddler形成的。

請參考知乎:www.zhihu.com/question/40… 有相應的解決辦法。

總結

本篇向你們介紹了爬蟲中HTTP的高級使用內容,主要圍繞CookieSessionHTTPs進行展開。後續會針對本篇內容進行詳細的爬蟲模擬登陸分享

若有不對的地方,歡迎你們指正。


關注微信公衆號Python數據科學,獲取 120G 人工智能 學習資料。

知乎:Python數據分析師

相關文章
相關標籤/搜索