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

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

作者:xiaoyu

微信公眾號:Python資料科學

知乎:Python資料分析師


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

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

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

Cookie解讀

1.什麼是Cookie?

Cookie原意是"小甜點"的意思,但是在網際網路上被用作儲存在使用者本地終端上的資料。 百度百科是這麼解釋的:

Cookie,有時也用其複數形式 Cookies,指某些網站為了辨別使用者身份、進行 session 跟蹤而儲存在使用者本地終端上的資料(通常經過加密)。定義於 RFC2109 和 2965 中的都已廢棄,最新取代的規範是 RFC6265。(可以叫做瀏覽器快取)

2.為什麼要使用Cookie?

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

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

<應用一>

比如,我們網上購物的時候,瀏覽了幾個網頁,選了幾樣商品放入了購物車。但是由於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互動過程

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

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

<1>步驟1的請求頭

解讀爬蟲中HTTP的祕密(高階篇)
看到請求頭裡面沒有Cookie,只是常規的頭域欄位資訊。

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

解讀爬蟲中HTTP的祕密(高階篇)
伺服器根據POST請求(使用者名稱密碼等)生成一個Cookie,並通過響應頭的set-Cookie欄位返回此Cookie資訊。

<3>步驟5的請求頭

解讀爬蟲中HTTP的祕密(高階篇)
再一次重新整理頁面的請求頭中就有了獲取Cookie資訊。

<4>步驟7的響應頭

解讀爬蟲中HTTP的祕密(高階篇)
第二次的響應頭無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的區別主要為以下四點:

一、https協議需要到ca申請證照,一般免費證照很少,需要交費。

二、http是超文字傳輸協議,資訊是明文傳輸,https 則是具有安全性的ssl加密傳輸協議

三、http和https使用的是完全不同的連線方式,用的也不一樣,前者是80,後者是443

四、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資料分析師

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

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

相關文章