一、利用requests.session進行登錄狀態保持
Requests模塊中的session類能夠自動處理發送請求獲取響應過程中產生的cookie,進而達到狀態保持的目的。
接下來我們通過requests.session登錄GitHub網學習
1、requests.session的作用以及應用場景
requests.session的作用:自動處理cookie,即 下一次請求會帶上前一次的cookie
requests.session的應用場景:自動處理連續的多次請求過程中產生的cookie
2、requests.session使用方法
session實例在請求了一個網站后,對方服務器設置在本地的cookie會保存在session中,下一次再使用session請求對方服務器的時候,會帶上前一次的cookie
session = requests.session() # 實例化session對象 response = session.get(url, headers, ...) response = session.post(url, data, ...)
session對象發送get或post請求的參數,與requests模塊發送請求的參數完全一致
3、測試
使用requests.session來完成github登陸,並獲取需要登陸后才能訪問的頁面
(1)提示
對github登陸以及訪問登陸后才能訪問的頁面的整個完成過程進行抓包
①、首先訪問https://github.com/login頁面,
②、打開Preserve log
,輸入賬號和密碼,點擊登錄按鈕進行登錄;登錄完成后找到一個名為session
的文件,
(2)確定登陸請求的url地址、請求方法和所需的請求參數,部分請求參數在別的url對應的響應內容中,可以使用re模塊獲取
# url1-獲取taken url1 = 'https://github.com/login' # 發送請求獲取響應 res_1 = session.get(url1, timeout=3).content.decode() # 正則提起 token = re.findall('name="authenticity_token" value="(.*?)" />', res_1) print(token)
(3)確定登陸后才能訪問的頁面的的url地址和請求方法
(4)利用requests.session完成代碼
import requests import re def login(): # session session = requests.session() # headers session.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/84.0.4147.89 Safari/537.36 SLBrowser/7.0.0.2261 SLBChan/10 " } # url1-獲取taken url1 = 'https://github.com/login' # 發送請求獲取響應 res_1 = session.get(url1, timeout=3).content.decode() # 正則提起 token = re.findall('name="authenticity_token" value="(.*?)" />', res_1) # 使用正則獲取登陸請求所需參數 print(token) # url2-登錄 url2 = 'https://github.com/session' # 構建表單數據 data = { "commit": "Sign in", # 固定值 "authenticity_token": token, # 該參數在登陸頁的響應內容中 "login": input('輸入github賬號:'), "password": input('輸入github賬號:') "webauthn - support": "supported", "webauthn - iuvpaa - support": "unsupported" } print(data) # 發送請求登錄 session.post(url2, data=data) # url3-驗證 # 將得到的頁面保存為html,然后打開保存后的github.html是否與自己登錄后的頁面一致 url3 = 'https://github.com/賬號的名稱' response = session.get(url3) with open('github.html', 'wb') as f: f.write(response.content) if __name__ == '__main__': login()
參考: Python爬蟲之Requests模塊session進行登錄狀態保持_兮尹的博客-CSDN博客_python requests 獲取session