本篇主要了解requests库是如何保持一个会话的
1.查看登录前后的cookie变化
首先打开登录页面,刷新一下,
fiddler会抓到一个请求,查看Inspectorstab中的Raw,可以看到请求头的详细信息

然后输入用户名、密码、验证码登录,查看登录后的请求头信息

发现登录前、登录后的cookie发生了变化
也可以通过Chrome浏览器来查看cookie,如下


可以看到浏览器中显示的cookie值和fiddler抓到请求中的cookie值不一致,
浏览器显示的是全部的cookie,
而fiddler只是显示的某个请求的cookie(每个请求的cookie会有所不同,我拿的是浏览器中的cookie)
如果要跳过验证码登录并保持登录状态,即保持一个会话
只需要提取登录后的cookie,并把它添加到一个requests库的Session对象即可;
2.添加cookie有2种方式
一是把cookie先写成字典形式,然后把字典转换为cookiejar
代码语言:javascript复制s = requests.Session() # 开启一个会话Session
cookie_dict={'49BAC005-7D5B-4231-8CEA-16939BEACD67': 'cktest001', # 从chrome浏览器中取到的cookie值
'JSESSIONID':'F4FFF69B8XXXXXXC8DCB4C061C0',
'JSESSIONIDSSO':'9D49C76FD6XXXXXF294242B44A'
}
s.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True) # 把cookie值转换为cookiejar类型,然后传给Session
注意:这个方法会替换掉原有的cookies二是追加cookies
代码语言:javascript复制s = requests.Session() # 开启一个会话Session
jar = requests.cookies.RequestsCookieJar() # 创建一个Cookie Jar对象
jar.set('49BAC005-7D5B-4231-8CEA-1XXXXBEACD67','cktXXXX001') # 向Cookie Jar对象中添加cookie值
jar.set('JSESSIONID','F4FFF69B8CXXXX80F0C8DCB4C061C0')
jar.set('JSESSIONIDSSO','9D49C7XXXX448FDF5B0F294242B44A')
s.cookies.update(jar) # 把cookies追加到Session中完整业务流程:登录并录入一条数据
页面功能如下,提交后数据库中便会多出一条数据

把登录后的cookie传入session后,
调用提交接口即可(如果不加登陆后cookie,直接调用提交接口会提示未登录)
代码语言:javascript复制# coding:utf-8
import requests
url = 'http://localhost.:8088/XXX/index/xxx.do' # 登录接口
header = { # 请求头,建议一定要写上,不写的话直接调用接口,会提示没有权限,可以直接从fiddler复制
"Host":"localhost.:8088",
"Connection":"keep-alive",
"Cache-Control":"max-age=0",
"Accept":"text/html,application/xhtml xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36",
"Referer":"http://localhost.:8088/XXX/index/xxx.do",
"Accept-Encoding":"gzip, deflate, sdch",
"Accept-Language":"zh-CN,zh;q=0.8"
}
s = requests.Session() # 开启一个会话Session
# cookie_dict={'49BAC005-7D5B-4231-8CEA-16XXXXEACD67': 'ckXeXX001',
# 'JSESSIONID':'F4FFF69B8XXXX0F0C8DCB4C061C0',
# 'JSESSIONIDSSO':'9D49XXXX448FDF5B0F294242B44A'
# }
# s.cookies = requests.utils.cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True)
# print(s.cookies)
jar = requests.cookies.RequestsCookieJar() # 创建一个Cookie Jar对象
jar.set('49BAC005-7D5B-4231-8CEA-1XXX39XEACD67','ckXXXX001') # 向Cookie Jar对象中添加cookie值
jar.set('JSESSIONID','F4FFF69BXXXX0F0C8DCB4C061C0')
jar.set('JSESSIONIDSSO','9D49C76FDXXXXF5B0F294242B44A')
s.cookies.update(jar) # 把cookies追加到Session中
#r1 = s.get(url, headers=header, verify=False) # 使用session发送登录请求
print(s.cookies)
# print(r1.text)
url2 = 'http://localhost:8088/XXX/xxx.do' # 提交咨询信息接口,通过fiddler抓取的
header2 = {
"Host":"localhost.:8088",
"Connection":"keep-alive",
"Content-Length":"89",
"Accept":"application/json, text/javascript, */*; q=0.01",
"Origin":"http://localhost.:8088",
"X-Requested-With":"XMLHttpRequest",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8",
"Referer":"http://localhost.:8088/XXX/xxx.do",
"Accept-Encoding":"gzip, deflate",
"Accept-Language":"zh-CN,zh;q=0.8"
}
data = {
'xxx': 'test',
'xxx': 'topic_test',
'xxx': '测试接口',
'xxx': '0'
}
r2 = s.post(url2, headers=header2, data=data, verify=False) # 使用session发送提交咨询请求 # verify=False表示忽略验证SSL证书
print(r2.text)
print(r2.status_code)返回结果

数据库也对应地增加了一条数据

注意:
在调用接口时,最好连请求头信息也一并传进去,不然有时候会请求失败,
我这里如果不加headers的话,会返回403,提示无权限
还有一个问题是,其实只要把登录后的cookies传入session,
然后用这个session发送提交咨询请求即可,无需再发送登录请求了(上面登录只是为了验证是否登录成功)


