前言
網站必須是登錄狀態才能查看網站信息,是最常見的反爬手段,下面我分享一下request模擬登錄狀態進行請求
目錄
模擬登錄的原理
直接復制網站Cookie模擬登錄狀態
通過登錄接口信息破解出Cookie模擬登錄狀態
模擬登錄的原理
網站是使用Cookie和session記錄網站的登錄狀態的
常見有三種情況
情況一
????????直接把用戶信息放到Cookie里面,明文暴露用戶信息,不安全,一般很少網站使用
情況二
????????網站通過session對用戶信息進行鍵值對的方式進行存儲,sesionID和用戶信息,cookie存儲的是sessionID,后臺通過cookie存儲的sessionID來對用戶信息進行尋找
情況三
????????分布式情況下,后臺把用戶信息存儲到Redis里面了,原理和情況二一樣
其他情況加入反爬加密,需要自己解密了
總結: 無論他是使用那種情況開發登錄功能,一般登錄狀態的信息在請求頭cookie或者Authorization里面
所以我們在request請求的時候拿到網站Cookie或者Authorization就可以保證網站的登錄狀態了,也就模擬了用戶登錄
直接復制網站Cookie模擬登錄狀態
這種適合自己臨時使用,因為Cookie會變,這樣獲取肯定不能長時間使用
找到你需要請求的接口,找到Cookie的字符串
import requests#添加請求頭用戶代理,模擬真人行為
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
}cookies = '在網頁上面獲取的cookie字符串'#處理Cookie字符串可以放到request里面使用
cookies = {item.split('=')[0]: item.split('=')[1] for item in cookies.split("; ")}
cookies = requests.utils.cookiejar_from_dict(cookies)url = "請求網址"response = requests.get(url, headers=headers, cookies=cookies)#得到網頁源代碼
print(response.text)
通過登錄接口信息破解出Cookie模擬登錄狀態
這種就是先使用這個網站的登錄接口進行登錄,看返回的信息里面一般是有生成Cookie信息的原材料
如果網站沒有反爬機制,就直接把Cookie信息給你了,下面我展示一下沒有反爬機制的代碼邏輯
import requests#給請求頭加入用戶代理,模擬真人環境
headers = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36"
}#我以登錄接口是post請求為例
loginUrl = "網站的登錄請求路徑"#請求體
loginData = {"key1": "value1","key2": "value2","key3": "value3"
}#調用請求接口
loginResponse = requests.post(loginUrl, data=loginData, headers=headers)#此時可以拿到登錄接口返回的cookie數據
#放入Cookie模擬登錄狀態,調用目標請求網站網址
url = "目標網站的網址"
res = requests.get(url, headers=headers,cookies=loginResponse.cookies)
#獲取到目標請求網頁的源代碼
print(res.text)
其實大多數網站是有反爬機制的,所以上面這種情況適用的網站很少
如果有反爬機制,他會把返回的Cookie信息進行加密處理什么的,那么就需要自己自行探索了
拿到Cookie信息,后面就和《直接復制網站Cookie模擬登錄狀態》步驟一樣了
如果很復雜,解密不了,可以操控瀏覽器來進行對Cookie的獲取,如果有需要的同志可以看我的文章
selenium基礎知識 和 模擬登錄selenium版本-CSDN博客