话不多说,直接上代码

测试代码

服务端

下面是用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的方法的更多相关文章

  1. 使用python requests模块搭建http load压测环境

    网上开源的压力测试工具超级的多,但是总有一些功能不是很符合自己预期的,于是自己动手搭建了一个简单的http load的压测环境 1.首先从最简单的http环境着手,当你在浏览器上输入了http://w ...

  2. Python之requests模块-session

    http协议本身是无状态的,为了让请求之间保持状态,有了session和cookie机制.requests也提供了相应的方法去操纵它们. requests中的session对象能够让我们跨http请求 ...

  3. Python—requests模块详解

    1.模块说明 requests是使用Apache2 licensed 许可证的HTTP库. 用python编写. 比urllib2模块更简洁. Request支持HTTP连接保持和连接池,支持使用co ...

  4. 使用monkey技术修改python requests模块

    例如请求前和请求后各来一条日志,这样就不需要在自己的每个代码都去加日志了. 其实也可以直接记录'urllib3.connectionpool'  logger name的日志. 修改了requests ...

  5. requests模块session处理cookie 与基于线程池的数据爬取

    引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不到我们想要的目的,例如: #!/usr/bin/ ...

  6. Python requests模块学习笔记

    目录 Requests模块说明 Requests模块安装 Requests模块简单入门 Requests示例 参考文档   1.Requests模块说明 Requests 是使用 Apache2 Li ...

  7. Python Requests模块讲解4

    高级用法 会话对象 请求与响应对象 Prepared Requests SSL证书验证 响应体内容工作流 保持活动状态(持久连接) 流式上传 块编码请求 POST Multiple Multipart ...

  8. Windows下安装Python requests模块

    在使用自己写的或者别人的python小工具时可能会出现类似ImportError: No module named Requests的问题: D:\tool\python\fuzz>Fuzz.p ...

  9. Python requests模块params、data、json的区别

    json和dict对比 json的key只能是字符串,python的dict可以是任何可hash对象(hashtable type): json的key可以是有序.重复的:dict的key不可以重复. ...

随机推荐

  1. Internet protocol security (ipsec) packet processing for multiple clients sharing a single network address

    Embodiments of the present invention address deficiencies of the art in respect to secure communicat ...

  2. Android显示gif格式图片

    大家知道,在Android中使用ImageView来显示gif格式的图片,我们无法得到gif格式图片该有的效果,它只会停在第一帧上,而不会继续.这时只能看到一张静态的图片,这里我们可以使用个简单的方法 ...

  3. Editplus配置Python的开发环境

    Python 有很多集成开发工具,商业的有komodo,Wingide,Boa 等,还有Python 自带的集成环境IDLE,Windows 下还有PythonWin 等.但是,这些工具有的是过于复杂 ...

  4. 简明Python3教程 首页

    A Byte of Python 'A Byte of Python' is a free book on programming using the Python language. It serv ...

  5. OpenGl(二)点线设置、多边形镂空

    1. 改变点的大小 OpenGL中默认点的大小是1个像素,使用函数glPointSIze可以调整点的大小,入参是GLfloat,相当于是浮点数. 相关代码: void myDisplay(void) ...

  6. C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)

    白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :- ...

  7. WPF RenderTransform的使用

    呈现变形的元素并没有改变位置,只是呈现在不同的位置而已,所以动画要用呈现变形 好处:为了效率,如果改变位置的话,需要重新测量,布局 <Window x:Class="wpf180709 ...

  8. 利用FR导出PDF汉字乱码的处理

    利用FR导出pdf,然后在unigui中显示,发现汉字乱码,改成gb2312,不乱码,但不自动折行,最后是改成DefaultCharSet搞定.FR版本:5.4.6 后记:有的浏览器中还是乱码,把字体 ...

  9. 毕业设计之感悟 —— UML 与 ER 图

    今天毕业设计答辩,虽然我第一个上场,但是不是特别紧张,因为整个系统都是我写的.我以为自己天衣无缝,能应付所有老师的所有问题.事实上,我被老师教育了一番. 老师说我,毕业论文中没有一个类.我一开始比较懵 ...

  10. 基于IOCP的高速文件传输代码

    //服务端: const   //transmit用的参数   TF_USE_KERNEL_APC     = $20;   //命令类型   CMD_CapScreen             =  ...