将`Cookie`放入`CookieJar`
我正在使用Python的Requests库来发送HTTP请求。我从服务器那里获取了一个文本格式的cookie。请问我该如何把这个cookie转换成一个包含这个cookie的CookieJar
呢?
9 个回答
15
我觉得很多回答没有抓住重点。有时候,其他库并不是在后台使用Requests。或者它没有暴露出正在使用的cookie jar。有时候我们手里只有cookie字符串。在我的例子中,我想从pyVmomi中借用认证cookie。
import requests
import http.cookies
raw_cookie_line = 'foo="a secret value"; Path=/; HttpOnly; Secure; '
simple_cookie = http.cookies.SimpleCookie(raw_cookie_line)
cookie_jar = requests.cookies.RequestsCookieJar()
cookie_jar.update(simple_cookie)
这给我们带来了以下的cookie_jar
:
In [5]: cookie_jar
Out[5]: <RequestsCookieJar[Cookie(version=0, name='foo', value='a secret value', port=None, port_specified=False, domain='', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=True, expires=None, discard=False, comment='', comment_url=False, rest={'HttpOnly': True}, rfc2109=False)]>
我们可以像往常一样使用它:
requests.get(..., cookies=cookie_jar)
51
旧版本的 Requests 库(0.14.2 及更早版本)在你传入一个 CookieJar
对象时,会自动把新的 cookies 放进一个“罐子”里:
import requests
import cookielib
URL = '...whatever...'
jar = cookielib.CookieJar()
r = requests.get(URL, cookies=jar)
r = requests.get(URL, cookies=jar)
第一次请求这个网址时,会把 cookies 填满这个“罐子”,第二次请求时就会把这些 cookies 发回给服务器。
从 2012 年发布的 Requests 1.0.0 开始,这个功能就不再有效了。
36
一个 Requests Session
可以接收和发送 cookies。
s = requests.Session()
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
print(r.text)
# '{"cookies": {"sessioncookie": "123456789"}}'
(上面的代码是从 Session 对象 中借来的。)
如果你希望 cookies 在你每次运行代码之间能够保存到磁盘上,你可以直接使用一个 CookieJar
来保存和加载它们:
from http.cookiejar import LWPCookieJar
import requests
cookie_file = '/tmp/cookies'
jar = LWPCookieJar(cookie_file)
# Load existing cookies (file might not yet exist)
try:
jar.load()
except:
pass
s = requests.Session()
s.cookies = jar
s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
r = s.get("http://httpbin.org/cookies")
# Save cookies to disk, even session cookies
jar.save(ignore_discard=True)
然后查看文件 /tmp/cookies:
#LWP-Cookies-2.0
Set-Cookie3: sessioncookie=123456789; path="/"; domain="httpbin.org"; path_spec; discard; version=0