这个问题严格来讲不是我碰到的,是偶尔在群里看到有人提问然后查了一波,发现原来还有这个问题,感觉自己以后也会碰到(最近做毕业设计全写的c++,根本没空摸Python,蛋疼。
首先,选择使用requests.session而不是单纯的requests.get或者post啥的理论上应该在第一次配置之后就能在后续请求中复用所有配置,比如,我们一般使用session来进行登录,这时候session对象会识别登录返回的请求中的set-cookie头并且自动为后续请求设置cookies。但是,如果我们需要手动加载cookie呢,是否还会像上面一样自动处理,比如如下的代码
import requests Cookie = { "AAA": "ISA", "BBB": "ISB" } Session = requests.session() testA = Session.get("https://www.httpbin.org/get",cookies = Cookie).json()["headers"].get("Cookie", "null") testB = Session.get("https://www.httpbin.org/get").json()["headers"].get("Cookie", "null") print("A: %s\nB: %s" % (testA, testB))
按照正常情况,我们在testA中加载的cookies应该会在后续的testB中也能够使用,但是,并没有。
这样如果我们要请求的页面必须使用cookies的话就需要在每次都带上 cookies = Cookie 了,这就很烦人,那么为什么这样不行呢,搜索一波,发现似乎是加载的方法的问题,这儿我们使用dict来加载cookies,加载的方法是针对单个请求的,这样似乎对后续的请求无效,所以需要对Session对象来"全局"设置一下。
所以我们可以使用Cookiejar
import requests Cookie = { "AAA": "ISA", "BBB": "ISB" } Session = requests.session() newCookie = requests.utils.cookiejar_from_dict(Cookie, cookiejar=None, overwrite=True) Session.cookies = newCookie # 这儿也可以像下面一样搞 # requests.utils.add_dict_to_cookiejar(Session.cookies, Cookie) testA = Session.get("https://www.httpbin.org/get").json()["headers"].get("Cookie", "null") testB = Session.get("https://www.httpbin.org/get").json()["headers"].get("Cookie", "null") print("A: %s\nB: %s" % (testA, testB))
当然,如果不嫌麻烦的话可以用 Session.cookies.set() 来手动设置key和value
如果批量的还是用dict作为中间介质然后转换一下加载
参考:
1. http://blog.csdn.net/zhu_free/article/details/50563756
2. https://www.cnblogs.com/kaibindirver/p/7767605.html
文章评论