解讀爬蟲中HTTP的秘密(高階篇)
作者:xiaoyu
微信公眾號: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交互過程
。
博主以一個訪問豆瓣
的實際例子作為上述過程的具體說明和描述。
<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是一個無狀態協議
。Session
和Cookie
的存在都是為了解決這個問題的。
由於伺服器本身並不會維持用戶的上下文,因此為了實現會話的跟蹤,不得不想出一種辦法。
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的默認埠及一個加密/身份驗證層(在HTTP
與TCP
之間)。這個系統的最初研發由網景公司(Netscape)進行,並內置於其瀏覽器NetscapeNavigator
中,提供了身份驗證與加密通訊方法。現在它被廣泛用於萬維網上安全敏感的通訊,例如交易支付方面。
2.HTTPs與HTTP的區別
超文本傳輸協議
HTTPS和HTTP的區別主要為以下四點:一、https協議需要到HTTP協議
被用於在Web瀏覽器和網站伺服器之間傳遞信息。HTTP協議以明文方式
發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站伺服器之間的傳輸報文,就可以直接讀懂其中的信息,因此HTTP協議不適合傳輸一些敏感信息,比如信用卡號、密碼
等。為了解決HTTP協議的這一缺陷,需要使用另一種協議:安全套接字層超文本傳輸協議HTTPS。
為了數據傳輸的安全,HTTPS在HTTP的基礎上加入了SSL協議
,SSL依靠證書來驗證伺服器的身份,並為瀏覽器和伺服器之間的通信加密。
ca申請證書
,一般免費證書很少,需要交費。二、http是超文本傳輸協議,信息是明文傳輸,https
則是具有安全性的ssl加密傳輸協議
。三、http和https使用的是完全不同的連接方式,用的埠
也不一樣,前者是80
,後者是443
。四、http的連接很簡單,是無狀態
的;HTTPS協議
是由SSL+HTTP協議
構建的可進行加密傳輸、身份認證的網路協議,比http協議安全。
3.HTTPs對爬蟲的影響
乍一看感覺HTTPs有點像反爬的手段,通過上面的了解,我們發現HTTPs是對伺服器端的驗證,通過CA證書
保證了我們訪問的網站是有身份的,而非其他假網站。相反,我們爬蟲模擬的是客戶端,並不受HTTPs的限制。
因此,HTTPs不影響我們爬蟲。
但是,我們在爬蟲的過程仍然也會遇到過類似SSL不通過之類的錯誤。比如,博主以前用requests訪問HTTPs的時候遇到過這樣的坑,但最後究其原因是同時打開了fiddler
造成的。
請參考知乎:https://www.zhihu.com/questio... 有相應的解決辦法。
總結
本篇向大家介紹了爬蟲中HTTP的高級使用內容,主要圍繞Cookie
、Session
和HTTPs
進行展開。後續會針對本篇內容進行詳細的爬蟲模擬登錄分享
。
如有不對的地方,歡迎大家指正。
可以關注微信公眾號Python數據科學,讓一切用數據說話。
推薦閱讀:
※一個Python小白5個小時爬蟲經歷
※python爬蟲學習記錄(1)
※輪帶逛終極版! 抓取輪子哥(vczh)全部知乎動態
※Python爬蟲教程(一)使用request+Beautiful爬取妹子圖
※五、信息標記與查找