1. <em id="yud1w"><acronym id="yud1w"><u id="yud1w"></u></acronym></em>
      
      
      <button id="yud1w"></button>

      python教程

      当前位置:首页?>?requests爬虫?>?当前文章

      requests爬虫

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

      2021-11-12 120赞 老董笔记
      每篇文章努力于解决一个问题!更多精品可移步文章底部。

        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

      文章评论

      requests会话对象Session跨请求保持cookie文章写得不错,值得赞赏
      国产99视频精品免视看6