一、利用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