python requests模块session的使用建议及整个会话中的所有cookie的方法

别说太多,去代码那里就行了。

[En]

Don’t say much, just go to the code.

测试代码

服务端

下面是一个用flASK制作的服务器,用来在打印请求时设置cookie和请求头

[En]

The following is a server made with flask, which is used to set the cookie and the request header when printing the request

# -*- 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不包含在内)

先启动服务器,然后再启动客户端

[En]

Start the server first, then start the client

运行结果

服务端打印结果

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'}
</requestscookiejar[<cookie></class>

总结及使用建议

  • 从服务器打印可以看到,如果我们不设置User-Agent,请求模块的请求头是python-Requests2.21.0,这不是普通浏览器的请求头,这也是我们爬虫时必须修改请求头的原因之一。
    [En]

    * from server printing, we can see that if we do not set User-Agent, the request header of requests module is python-requests/2.21.0, which is not the request header of normal browsers, which is one reason why we have to modify the request header when we are crawlers.

  • 使用Requests.Session()可以帮助我们保存本次会话中的所有cookie,不再需要我们获取上一次请求的cookie,然后更新cookie,重置,然后请求这些操作。
    [En]

    * using requests.session () can help us save all the cookie during this session, eliminating the need for us to get the cookie of the previous request, then update the cookie, reset and then request such operations.

  • 将在整个会话期间通过s.cookie和s.Header设置的Cookie和Header
    [En]

    * cookie and header that will be carried throughout the session set through s.cookies and s.headers

  • 通过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
  • 建议在重用过程中提前设置公共部分,如头部、Cookie、Proxies
    [En]

    * it is recommended that we set up the public parts in advance in the process of reuse, such as headers,cookies,proxies

  • 最近使用发现,如果整个过程中某些cookie被多次设置,直接使用dict强转会失败,最稳妥的办法,还是使用requests.utils.dict_from_cookiejar(s.cookies)来得到字典类型的cookies

Original: https://www.cnblogs.com/huchong/p/11091307.html
Author: 听风。
Title: python requests模块session的使用建议及整个会话中的所有cookie的方法

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/6215/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

最近整理资源【免费获取】:   👉 程序员最新必读书单  | 👏 互联网各方向面试题下载 | ✌️计算机核心资源汇总