话不多说, 直接上代码
测试代码
服务端
下面是用 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
来源: https://www.cnblogs.com/huchong/p/11091307.html