寫在前面
在某些網站抓取,或者app抓取時,有的時強制登陸,有的是不登陸返回的數據就是假的或者說是不完整的數據,這時就需要用到保持會話的功能
1、requests.session簡單例子
參考源:https://www.cnblogs.com/qican/p/11153824.html
requests庫的session對象能夠幫我們跨請求保持某些參數,也會在同一個session實例發出的所有請求之間保持cookies
代碼
import requests
s = requests.Session()
s.get('https://httpbin.org/get')
requests.Session().get()和requests.get(),除了前者能傳遞cookie參數以外,其他的一致
2、模擬百度登錄
首先我們打開百度,查看登錄後百度賬號的cookies值,經過觀察發現是由”BAIDUID“和"BDUSS"記錄登錄狀態
在網頁裏面登錄後,複製”BAIDUID“和"BDUSS"這兩個參數的值
# coding:utf-8
import requests
# 保持登錄狀態
s = requests.session()
url = 'https://www.baidu.com/'
# 請求頭
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36"
}
r = s.post(url,headers=headers)
# 查看的cookies值
cooks = {
"BDUSS":"xxxxxxx",
"BAIDUID":"XXXXXXXX"
}
# 添加登錄所攜帶的cookies
c = requests.cookies.RequestsCookieJar()
c.set("BDUSS",cooks["BDUSS"])
c.set("BAIDUID",cooks["BAIDUID"])
s.cookies.update(c)
# 判斷是否登錄成功
r2 = s.get(url,headers=headers)
if '換膚' in r2.text:
print('登錄成功')
else:
print("登錄失敗")
### 運行結果:登錄成功
這裏爲什麼要if ‘換膚’在r2裏,因爲登錄前頁面代碼裏是沒有這個詞的,登錄後纔有
登錄前:
登陸後: