您的位置: 网站首页> requests爬虫> 当前文章

requests会话对象Session跨请求保持cookie

老董-我爱我家房产SEO2021-11-12174围观,133赞

  http协议是无状态的,也就是说正常情况下同1个浏览器访问了A页面,接下来访问B页面,服务器是不知道这2次是1个人的。基于此引入了一些其他用户跟踪技术(比如cookie与session)。

  requests提供了一种会话对象来实现跨请求保持某些参数。它也会在同一个Session实例发出的所有请求之间保持cookie, 而且如果向同一主机发送多个请求,底层的TCP连接会被重用从而带来性能提升。

  先看一个传统的get请求

r = requests.get('http://httpbin.org/cookies/set/sessioncookie/123456789') # 第1次请求
print(r.text)
print('==================')
r = requests.get("http://httpbin.org/cookies") # 第2次请求
print(r.request.headers)
{
  "cookies": {
    "sessioncookie": "123456789"
  }
}

==================
{'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}

  上述代码可以看出第1次请求服务器返回cookie内容,第2次请求却没有携带上cookie内容,所以这2次请求服务器并不知道这是同1个客户端所为!

  再看Session实例请求

s = requests.Session()

r = s.get('http://httpbin.org/cookies/set/sessioncookie/123456789') # 第1次请求
print(r.text)
print('==================')
r = s.get("http://httpbin.org/cookies") # 第2次请求
print(r.request.headers)
{
  "cookies": {
    "sessioncookie": "123456789"
  }
}

==================
{'User-Agent': 'python-requests/2.26.0', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'sessioncookie=123456789'}

  上述代码可以看出第1次请求服务器返回cookie内容,第2次请求头里携带上了cookie内容,实现了跨请求保持cookie!

  通过方法传参不能保持cookie

  会话能保存的是服务器端响应过来的cookie,所以即使使用了会话,如果是靠方法级别的cookie参数传参则不会被跨请求保持,如下代码可以看到第1个请求是通过cookie参数传参cookie,第2个请求却没有cookie内容。

s = requests.Session()

r = s.get('http://httpbin.org/cookies', cookies={'from-my': 'browser'})
print(r.text)
print('=============')
r = s.get('http://httpbin.org/cookies')
print(r.text) # 返回cookie内容
{
  "cookies": {
    "from-my": "browser"
  }
}

=============
{
  "cookies": {}
}

  会话还可以用作前后文管理器,这样就能确保with区块退出后会话能被关闭,即使发生了异常也一样。

with requests.Session() as s:
    s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')

  更多关于会话和cookie操作可以参考官方文档。

  https://docs.python-requests.org/zh_CN/latest/api.html#api-cookies

  https://docs.python-requests.org/zh_CN/latest/api.html#sessionapi

很赞哦!

python编程网提示:转载请注明来源www.python66.com。
有宝贵意见可添加站长微信(底部),获取技术资料请到公众号(底部)。同行交流请加群 python学习会

文章评论

    requests会话对象Session跨请求保持cookie文章写得不错,值得赞赏

站点信息

  • 网站程序:Laravel
  • 客服微信:a772483200