Python爬蟲必須掌握的概念—Cookie和Session
Cookie和Session
- 前言cookie 和 session 得由來CookieCookie 屬性Cookie 創(chuàng)建Cookie 分類SessionSession 工作原理創(chuàng)建 Session保存 Session銷毀 Session檢查Session 是否失效總結(jié) Cookie Session相同點:不同點:工作流程:
前言
最近總是有一些初學(xué)爬蟲的小伙伴總是搞不懂 Session 和 Cookie 到底是做什么的,為什么爬蟲訪問網(wǎng)頁的時候都用 Session 去訪問,為什么 headers 攜帶 Cookie 就可以以登陸形式進(jìn)入網(wǎng)頁了,這兩個東西的原理究竟是什么呢?
cookie 和 session 的由來
在Web發(fā)展史中,我們知道瀏覽器與服務(wù)器間采用的是簡單的 http 協(xié)議,而這種協(xié)議是‘無狀態(tài)’的,所以這就導(dǎo)致了服務(wù)器無法知道是誰在瀏覽網(wǎng)頁,但很明顯,一些網(wǎng)頁需要知道用戶的狀態(tài),例如登陸,購物車等。
所以為了解決這一問題,先后出現(xiàn)了四種技術(shù),分別是 隱藏表單域 ,URL重寫 ,Cookie ,Session ,當(dāng)然現(xiàn)階段用的最多的技術(shù)自然是 Cookie 和 Session 了。
Cookie
Cookie 是瀏覽器保存到用戶電腦上面的一個文本,簡單來說就是當(dāng)一個用戶通過 http 請求訪問到服務(wù)器端的時候,服務(wù)器會將一些字典的鍵值對返回給客戶端瀏覽器,并給這些數(shù)據(jù)加上一些限制條件,在條件符合時這個用戶下次訪問這個服務(wù)器時,數(shù)據(jù)通過請求頭又被完整地給帶回服務(wù)器,服務(wù)器根據(jù)這些信息來判斷不同的用戶。
簡單來說,Cookie 是服務(wù)器傳輸給客戶端并保存到客戶端的一段文本信息, Cookie 是有大小和數(shù)量限制的。
Cookie 屬性
當(dāng)我們訪問網(wǎng)頁的時候,我們看到網(wǎng)站的請求頭如果攜帶 Cookie 都會含有 Set-Cookie 的屬性,在這里分析一下 Set-Cookie 都包含什么屬性項:
屬性項屬性項介紹Name=VALUE鍵值對,可以設(shè)置保存的鍵值對屬性,這里的NAME不能和其他屬性的名字相同Expires過期時間,這個時間后Cookie便會失效Domain生成Cookie的域名空間Path這個Cookie在系統(tǒng)哪個文件路徑下生成的Secure加密設(shè)置,設(shè)置之后只能在SSH連接環(huán)境下才能回傳這個Cookie屬性
在這里仔細(xì)介紹一下 Domain 究竟是做什么的。
現(xiàn)在假設(shè)有兩個域名:
- 域名A:a.qq.com.cn
- 域名B:b.qq.com.cn
顯然域名A和域名B都是qq.com.cn的子域名。
- 如果我們在域名A中的 Cookie 的 domain 設(shè)置為 qq.com.cn ,那么 qq.com.cn 及其子域名都可以獲取這個 Cookie,即域名A和域名B都可以獲取這個 Cookie。
- 如果域名A和域名B同時設(shè)置 Cookie 的 doamin 為 qq.com.cn,那么將出現(xiàn)覆蓋的現(xiàn)象。
- 如果域名A沒有顯式設(shè)置 Cookie 的 domain 方法,那么 domain 就為 a.qq.com.cn,不一樣的是,這時,域名A的子域名將無法獲取這個 Cookie。
Cookie 創(chuàng)建
Set-Cookie: value[; expires=date][; domain=domain][; path=path][; secure]
- Set-Cookie:delPer=0; expires=Thu, 16-Aug-2050 12:15:40 GMT
- Set-Cookie:BDSVRTM=0; path=/
- Set-Cookie:BD_HOME=0; path=/
- Set-Cookie:H_PS_PSSID=1462_21106_26925_22074; path=/; domain=.baidu.com
構(gòu)建http返回字節(jié)流時是將 Header 中所有的項順序?qū)懗?,而沒有進(jìn)行任何修改。所以瀏覽器在接收 http 返回的數(shù)據(jù)時是分別解析每一個 Header 項。
Cookie 分類
- 會話級別 Cookie:所謂會話級別 Cookie,就是在瀏覽器關(guān)閉之后 Cookie 就會失效。
- 持久級別 Cookie:保存在硬盤的 Cookie,只要設(shè)置了過期時間就是硬盤級別 Cookie。
現(xiàn)在 Cookie 保存在了客戶端,當(dāng)我們?nèi)フ埱笠粋€URL時,瀏覽器會根據(jù)這個URL路徑將符合條件的 Cookie 放在請求頭中傳給服務(wù)器。
Session
Cookie 是有大小限制和數(shù)量限制的,并且越來越多的 Cookie 代表客戶端和服務(wù)器的傳輸量增加,可不可以每次傳的時候不傳所有 Cookie 值,而只傳一個唯一ID,通過這個ID直接在服務(wù)器查找用戶信息呢?答案是有的,這就是我們的 Session。
Session 是基于 Cookie 來工作的,同一個客戶端每次訪問服務(wù)器時,只要當(dāng)瀏覽器在第一次訪問服務(wù)器時,服務(wù)器設(shè)置一個id并保存一些信息(例如登陸就保存用戶信息,視具體情況),并把這個id通過 Cookie 存到客戶端,客戶端每次和服務(wù)器交互時只傳這個id,就可以實現(xiàn)維持瀏覽器和服務(wù)器的狀態(tài),而這個ID通常是 NAME 為 JSESSIONID 的一個 Cookie。
現(xiàn)階段一共有四種方法讓 Session 工作:
- 通過URL傳遞SessionID
- 通過Cookie傳遞SessionID
- 通過SSL傳遞SessionID
- 通過隱藏表單傳遞SessionID
Session 工作原理

創(chuàng)建 Session
當(dāng)客戶端訪問到服務(wù)器,服務(wù)器會為這個客戶端通過 request.getSession() 方法創(chuàng)建一個 Session ,如果當(dāng)前 SessionID 還沒有對應(yīng)的 HttpSession 對象,就創(chuàng)建一個新的,并添加到 org.apache.catalina.Manager 的 Sessions 容器中保存,這就做到了對狀態(tài)的保持。當(dāng)然,這個 SessionID 是唯一的
保存 Session
由圖可知,Session 對象已經(jīng)保存在了 Manager 類中,StandardManager 作為實現(xiàn)類,通過 requestedSessionId 從 StandardManager 的 Sessions 集合中取出 StandardSession 對象。
我們來看看 StandardManager 是如何對所有 StandardSession 對象進(jìn)行生命周期管理
當(dāng) Servlet 容器關(guān)閉:StandardManager 將持久化沒過期的 StandardSession 對象(必須調(diào)用 Servlet 容器中的 stop 和 start 命令,不能直接 kill)
當(dāng) Servlet 容器重啟時:StandardManager 初始化會重讀這個文件,解析出所有 session 對象。
銷毀 Session
Session 的聲明周期是從創(chuàng)建到超時過期。
也就是說,當(dāng) Session 創(chuàng)建后,瀏覽器關(guān)閉,會話級別的 Cookie 被銷毀,如果沒有超過設(shè)定時間,該 SessionID 對應(yīng)的 Session 是沒有被銷毀的。
檢查Session 是否失效
檢查每個 Session 是否失效是在 Tomcat 的一個后臺線程完成的( backgroundProcess() 方法中);除了后臺進(jìn)程檢驗 Session 是否失效外,調(diào)用 request.getSession() 也會檢查該 Session 是否過期,當(dāng)然,調(diào)用這種方法如果過期的話又會重新創(chuàng)建一個新的 Session。
總結(jié) Cookie Session
相同點:
- Session 和 Cookie 都是為了讓 http 協(xié)議又狀態(tài)而存在。
- Session 通過 Cookie 工作,Cookie 傳輸?shù)?SessionID 讓 Session 知道這個客戶端到底是誰。
不同點:
- Session 將信息保存到服務(wù)器,Cookie 將信息保存在客戶端。
工作流程:
當(dāng)瀏覽器第一次訪問服務(wù)器時,服務(wù)器創(chuàng)建 Session 并將 SessionID 通過 Cookie 帶給瀏覽器保存在客戶端,同時服務(wù)器根據(jù)業(yè)務(wù)邏輯保存相應(yīng)的客戶端信息保存在 Session 中;客戶端在訪問時上傳 Cookie ,服務(wù)器得到 Cookie 后獲取里面的 SessionID,來維持狀態(tài)。