python requests模块session的使用建议及整个会话中的所有cookie的方法
话不多说,直接上代码
测试代码
服务端
下面是用flask做的一个服务端,用来设置cookie以及打印请求时的请求头
# -*- coding: utf-8 -*-
from flask import Flask, make_response, request
app = Flask(__name__)
@app.route('/a1')
def a1():
print(request.headers)
rp = make_response()
rp.set_cookie('a1', '123')
return rp
@app.route('/a2')
def a2():
print(request.headers)
rp = make_response()
# rp.set_cookie('a2', '234')
return rp
@app.route('/a3')
def a3():
print(request.headers)
rp = make_response()
rp.set_cookie('a3', '345')
return rp
if __name__ == '__main__':
app.run(host='0.0.0.0')
客户端
# -*- coding: utf-8 -*-
import requests
url1 = 'http://192.168.2.159:5000/a1'
url2 = 'http://192.168.2.159:5000/a2'
url3 = 'http://192.168.2.159:5000/a3'
cookies = requests.utils.cookiejar_from_dict({'test': 'test'})
print(type(cookies), cookies) # RequestsCookieJar 对象
s = requests.session()
s.cookies = cookies # 这里设置的cookie test=test 是所有请求中都会附带的
s.headers = {'h1':'h1'} # 这里设置的请求头h1=h1是所有请求中都会附带的
r1 = s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'}) # 临时加上cookie r1=r1 和 header h2=h2 下一个请求中不会有此 cookie 和header
r2 = s.get(url2)
requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'}) # 在接下来的请求中,永久添加xx cookie
r3 = s.get(url3)
# r1.cookies 是一个RequestsCookieJar对象,可以使用 requests.utils.dict_from_cookiejar(r1.cookies) 将其转换成dict
# 我发现可以直接用dict进行转换,这样写起来更方便
print(dict(r1.cookies)) # 打印r1请求的返回结果中设置的cookies
print(dict(r2.cookies)) # 打印r2请求的返回结果中设置的cookies
print(dict(r3.cookies)) # 打印r3请求的返回结果中设置的cookies
print(dict(s.cookies)) # s.cookies中包含整个会话请求中的所有cookie(临时添加的如上面的r1不包含在内)
先启动服务端,再启动客户端
运行结果
服务端打印结果
192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a1 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
H2: h2
Cookie: test=test; r1=r1
192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a2 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
Cookie: test=test; a1=123
192.168.2.159 - - [26/Jun/2019 17:28:00] "GET /a3 HTTP/1.1" 200 -
Host: 192.168.2.159:5000
Accept-Encoding: identity
H1: h1
Cookie: test=test; xx=xx; a1=123
客户端打印结果
<class 'requests.cookies.RequestsCookieJar'> <RequestsCookieJar[<Cookie test=test for />]>
{'a1': '123'}
{}
{'a3': '345'}
{'test': 'test', 'xx': 'xx', 'a1': '123', 'a3': '345'}
总结及使用建议
通过服务端打印可以看出,如果我们不设置User-Agent, requests模块的请求头是python-requests/2.21.0,这不是正常浏览器的请求头,这也是为什么我们做爬虫时一定要修改请求头的一个原因
使用requests.session()可以帮助我们保存这个会话过程中的所有cookie,可以省去我们自己获取上一个请求的cookie,然后更新cookie后重新设置再进行请求这类操作
通过s.cookies 和s.headers设置的整个会话中都会携带的cookie和header
通过s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'}) 这种形式设置的cookie和header 不会覆盖s.cookies和s.headers中设置的请求头和cookie,只是在此次请求中添加此cookie和header,下个请求中不会携带这里的r1和h2
requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'}) 可以给s设置固定cookie: xx ,这种设置的cookie 不是临时的,后面的请求中都会携带
r1.cookies 的结果是RequestsCookieJar对象,可以通过dict对其转换,得到一个dict,其内容是r1请求响应头中设置的cookie,如果当前请求没有被设置新cookie,则dict后的是一个空字典
s.cookies 的结果是整个会话过程(通过s发送的所有请求的过程)被设置的cookie,所有通过dict(s.cookies) 可以得到所有被设置cookie
建议我们再使用的过程中,把公共部分提前设置好,比如headers,cookies,proxies
最近使用发现,如果整个过程中某些cookie被多次设置,直接使用dict强转会失败,最稳妥的办法,还是使用requests.utils.dict_from_cookiejar(s.cookies)来得到字典类型的cookies
python requests模块session的使用建议及整个会话中的所有cookie的方法的更多相关文章
- 使用python requests模块搭建http load压测环境
网上开源的压力测试工具超级的多,但是总有一些功能不是很符合自己预期的,于是自己动手搭建了一个简单的http load的压测环境 1.首先从最简单的http环境着手,当你在浏览器上输入了http://w ...
- Python之requests模块-session
http协议本身是无状态的,为了让请求之间保持状态,有了session和cookie机制.requests也提供了相应的方法去操纵它们. requests中的session对象能够让我们跨http请求 ...
- Python—requests模块详解
1.模块说明 requests是使用Apache2 licensed 许可证的HTTP库. 用python编写. 比urllib2模块更简洁. Request支持HTTP连接保持和连接池,支持使用co ...
- 使用monkey技术修改python requests模块
例如请求前和请求后各来一条日志,这样就不需要在自己的每个代码都去加日志了. 其实也可以直接记录'urllib3.connectionpool' logger name的日志. 修改了requests ...
- requests模块session处理cookie 与基于线程池的数据爬取
引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: #!/usr/bin/ ...
- Python requests模块学习笔记
目录 Requests模块说明 Requests模块安装 Requests模块简单入门 Requests示例 参考文档 1.Requests模块说明 Requests 是使用 Apache2 Li ...
- Python Requests模块讲解4
高级用法 会话对象 请求与响应对象 Prepared Requests SSL证书验证 响应体内容工作流 保持活动状态(持久连接) 流式上传 块编码请求 POST Multiple Multipart ...
- Windows下安装Python requests模块
在使用自己写的或者别人的python小工具时可能会出现类似ImportError: No module named Requests的问题: D:\tool\python\fuzz>Fuzz.p ...
- Python requests模块params、data、json的区别
json和dict对比 json的key只能是字符串,python的dict可以是任何可hash对象(hashtable type): json的key可以是有序.重复的:dict的key不可以重复. ...
随机推荐
- 【Struts2学习笔记(4)】指定需要Struts 2请求后缀的常量定义复杂的过程
一.指定需要Struts 2请求后缀处理 我们是在违约前.action后缀访问Action. 事实上默认后缀是通过不断"struts.action.extension"进行更改.例 ...
- tap code —— 两个一位数字编码一个字母
5 * 5 的矩阵(表格)编码 26 个字母 单词中如果出现 K,就用 C 代替,所以其实也可视为表中无 K 这个字母(据说拉丁文中 K 都是用 C 来代替的): 在<疑犯追踪>(POI, ...
- Go语言并发
Go语言并发机制初探 Go 语言相比Java等一个很大的优势就是可以方便地编写并发程序.Go 语言内置了 goroutine 机制,使用goroutine可以快速地开发并发程序, 更好的利用多核处 ...
- Crystal Report - 利用后台代码设计或实现水晶报表工具栏相关功能
水晶报表工具栏分页按钮响应事件: 水晶报表中有自带的分页功能,在设置好每页显示的记录后会自动分页,并自动记录总页数和保存当前页,在工具栏可以通过“首页”“尾页”“下一页”“上一页”和“跳页”进行页面跳 ...
- andriod 实现新浪、QQ场地、朋友微信圈、微信朋友分享功能
前言:在自己的学习过程中的一些操作,分享一些理解. 下面将说明什么: 下载链接:http://download.csdn.net/detail/u014608640/7490357 首先.我们须要去S ...
- STL关联式容器之map和multimap
一,map和multimap的概念 1.map和multimap的基本知识 map是标准的关联式容器,一个map是一个键值对序列,即(key,value)对.它提供基于key的快速检索能力. map中 ...
- 机器学习:深入理解LSTM网络 (二)
之前我们介绍了RNN 网络结构以及其所遇到的问题,RNN 结构对于关联度太长的时序问题可能无法处理, 简单来说,RNN对于太久远的信息不能有效地储存,为了解决这个问题,有人提出了LSTM的网络结构,L ...
- GlyphRun 对象和 Glyphs 元素简介
原文 GlyphRun 对象和 Glyphs 元素简介 GlyphRun 简介 Windows Presentation Foundation (WPF) 提供高级的文本支持包括直接访问的标志符号级标 ...
- 【msdn wpf forum翻译】TextBox中文本 中对齐 的方法
原文:[msdn wpf forum翻译]TextBox中文本 中对齐 的方法 原文链接:http://social.msdn.microsoft.com/Forums/en-US/wpf/threa ...
- Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式
原文:Android Camera2 拍照(三)--切换摄像头,延时拍摄和闪光模式 一.切换摄像头 在前后摄像头之间切换,首先需要关闭之前打开的摄像头,关闭preview,之后重新打开新的摄像头,重新 ...