requests模块中的Session类能够自动处理发送请求获取响应过程中产生的cookie,进而达到状态保持的目的。
1.1 requests.session的作用以及应用场景- requests.session的作用
- 自动处理cookie,即 下一次请求会带上前一次的cookie
- requests.session的应用场景
- 自动处理连续的多次请求过程中产生的cookie
session实例在请求了一个网站后,对方服务器设置在本地的cookie会保存在session中,下一次再使用session请求对方服务器的时候,会带上前一次的cookie
session = requests.session() # 实例化session对象
response = session.get(url, headers, ...)
response = session.post(url, data, ...)
- session对象发送get或post请求的参数,与requests模块发送请求的参数完全一致
使用requests.session来完成github登陆,并获取需要登陆后才能访问的页面
1.3.1 提示
- 对github登陆以及访问登陆后才能访问的页面的整个完成过程进行抓包
- 确定登陆请求的url地址、请求方法和所需的请求参数
- 部分请求参数在别的url对应的响应内容中,可以使用re模块获取
- 确定登陆后才能访问的页面的的url地址和请求方法
- 利用requests.session完成代码
思路截图:
示例代码:
import requests
import re
def login():
# session
session = requests.session()
# headers
session.headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'
}
# url-获取token
url1 = 'https://github.com/login'
# 发送请求获取响应
res_1 = session.get(url1).content.decode()
# print(res_1)
# 正则提取
token = re.findall('', res_1)[0] # 此处正则在打印出来的终端中获取,不要直接从F12中复制
print(token)
# url2-登录
url2 = 'https://github.com/session'
# 构建表单数据
data = { # data中的数据只需要token、login和password也是可以登录成功的
# 'commit': 'Sign in',
'authenticity_token': token,
'login': 'xxxxxx',
'password': 'xxxxxxx',
# 'webauthn-support': 'supported',
# 'webauthn-iuvpaa-support': 'unsupported',
# 'timestamp': '1611468618614',
# 'timestamp_secret': '0aeef8430701271fd17269ecde4b017549c9238b7a24829379772b344e301fea',
}
print(data)
# 发送请求登录
session.post(url2, data=data)
# url3-验证
url3 = 'https://github.com/xxxxx'
response = session.get(url3)
print(response.content.decode())
login()
运行效果:
示例代码2:
import requests
import re
# 构造请求头字典
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36',
}
# 实例化session对象
session = requests.session()
# 访问登陆页获取登陆请求所需参数
response = session.get('https://github.com/login', headers=headers)
authenticity_token = re.search('name="authenticity_token" value="(.*?)" />', response.text).group(1) # 使用正则获取登陆请求所需参数
# 构造登陆请求参数字典
data = {
'commit': 'Sign in', # 固定值
'utf8': '✓', # 固定值
'authenticity_token': authenticity_token, # 该参数在登陆页的响应内容中
'login': input('输入github账号:'),
'password': input('输入github账号:')
}
# 发送登陆请求(无需关注本次请求的响应)
session.post('https://github.com/session', headers=headers, data=data)
# 打印需要登陆后才能访问的页面
response = session.get('https://github.com/xxxxxx', headers=headers)
print(response.text)