相關實戰案例:[爬蟲實戰] 爬取小說標題與對應內容
相關爬蟲專欄:JS逆向爬蟲實戰??爬蟲知識點合集??爬蟲實戰案例
一、引入場景
在http協議中,瀏覽器是無狀態(即無記憶)的,對于請求與響應的產生數據,瀏覽器都不會保留。這對于某些希望記住用戶當前狀態,保存用戶信息的網站就不太友好。cookie與session就是用于處理這個問題的,二者都用于保存用戶當前的狀態。
二、cookie的作用
概念:cookie 是瀏覽器端用來跟蹤用戶狀態的機制。
當用戶訪問網站時會攜帶一個空cookie發起請求,而服務器返回響應數據時則會傳回一個cookie給瀏覽器作為身份驗證。此后再訪問該網站就會自動攜帶這個,作為身份信息查詢。
cookie最常見作用為會話管理(跟蹤和管理用戶的交互行為):
- 登錄狀態 -- 保存登錄信息
- 購物車 -- 保存當前商品狀態
- 個性化設置 -- 保存當前用戶偏好(語言、主題等)
特點:
- 存儲在客戶端(瀏覽器)
- 有過期時間限制
- 安全性較差,可能會被惡意攻擊
三、session的作用與其跟cookie的區別
概念:Session是服務器端用來跟蹤用戶狀態的機制。
當用戶首次訪問服務器時,服務器會為其創建一個獨特的Session ID,存儲在服務器中。而為了能讓瀏覽器后續請求能帶上這個ID,一般也會將Sesion ID通過cookie形式傳遞給瀏覽器。
與cookie區別:
- 位置:cookie存于客戶端 - session存于服務器端,只給客戶端傳一個session id
- 內容:cookie存少量、非敏感數據 - session存復雜,敏感數據
- 安全:cookie相對較差(客戶端處容易被篡改) - session相對更優(服務器端難以修改)
結:
cookie與session經常協同合作。cookie更像是信使,主要作用是幫助傳遞session ID。而session因為其安全性高、存儲量大,信息位于服務器端等優勢,通常被認為是真正的“記憶”所在處。
四、cookie與session在爬蟲中的涉及
爬蟲中常有遇到需要正確理解cookie/session機制,從而破解含有分頁、登錄、反爬等的網站。
這里我們就會用到非常強大的工具:requests.session(取代requests.get/post):
1.requests.get/post()的痛點
(1) 無法維持自動化登錄狀態
HTTP協議是無狀態的,requests.get每次都是獨立請求,無法獲得并保存之前瀏覽器返回的cookie。這個問題會導致每次請求都必須重新發送登錄信息并手動解析與提取,導致代碼明顯復雜而且也無法維持自動化的登錄。
(2) 效率底下
每次調用request.get都會嘗試建立一個全新的TCP連接的三次握手還有可能存在的SSL/TLS(安全加密協議)握手。這個過程中重復建立與關閉連接的開銷很大,明顯拖累爬取進度,效率低下。
(3) 容易觸發服務器的連接頻率限制
對于部分爬取的網站,requests.get過高的連接/斷開頻率與真實瀏覽器的訪問樣式明顯不同。當被識別為異常訪問后很可能直接將其斷開或拒絕服務。
怎么辦呢?這里就輪到我們的requests.session大人登場了
2.requests.session的優點
以上的痛點都能被requests.session高效解決:
- 自動管理會話 -- 在發送請求的過程中會自動獲取并返回對應cookie
- 高效連接復用 -- Session會自建一個連接池,在發送多個連接時會嘗試復用已建立的TCP連接,顯著減少建立連接時的開銷。
- 有效規避對連接頻率的反爬 -- 瀏覽器只會看到建立穩定持久鏈接上的數據傳輸
3. 用法
非常簡單:
session = requests.session()
response =session.get/post()
只用加上句話,再把請求中的requests改成session,其他照常寫即可。
這個實戰與相關圖文講解可以幫你快速建立起對requests.session用法與其強大之處的感覺:
五、小結
cookie與session都是用來跟蹤用戶狀態,保存用戶信息,而session則在其中起主要作用。
在日常爬取中盡量把以前常用的requests的請求方式改為requests.session,能夠明顯提高爬蟲代碼的健壯度。