Python Requests模块session的使用建议

本篇主要讲解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。

行动吧,在路上总比一直观望的要好,未来的你肯定会感 谢现在拼搏的自己!如果想学习提升找不到资料,没人答疑解惑时,请及时加入扣群: 320231853,里面有各种软件测试+开发资料和技术可以一起交流学习哦。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

  • 23
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值