一、利用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进行登录状态保持