话很少说,直接上代码html
测试代码
服务端
下面是用flask作的一个服务端,用来设置cookie以及打印请求时的请求头python
# -*- 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不包含在内)
先启动服务端,再启动客户端flask
运行结果
服务端打印结果
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后从新设置再进行请求这类操做cookie
-
经过s.cookies 和s.headers设置的整个会话中都会携带的cookie和headersession
-
经过s.get(url1, cookies={'r1': 'r1'},headers={'h2':'h2'}) 这种形式设置的cookie和header 不会覆盖s.cookies和s.headers中设置的请求头和cookie,只是在这次请求中添加此cookie和header,下个请求中不会携带这里的r1和h2app
-
requests.utils.add_dict_to_cookiejar(s.cookies, {'xx': 'xx'}) 能够给s设置固定cookie: xx ,这种设置的cookie 不是临时的,后面的请求中都会携带ide
-
r1.cookies 的结果是RequestsCookieJar对象,能够经过dict对其转换,获得一个dict,其内容是r1请求响应头中设置的cookie,若是当前请求没有被设置新cookie,则dict后的是一个空字典测试
-
s.cookies 的结果是整个会话过程(经过s发送的全部请求的过程)被设置的cookie,全部经过dict(s.cookies) 能够获得全部被设置cookieurl
-
建议咱们再使用的过程当中,把公共部分提早设置好,好比headers,cookies,proxies
-
最近使用发现,若是整个过程当中某些cookie被屡次设置,直接使用dict强转会失败,最稳妥的办法,仍是使用requests.utils.dict_from_cookiejar(s.cookies)来获得字典类型的cookies
原文出处:https://www.cnblogs.com/huchong/p/11091307.html