将`Cookie`放入`CookieJar`

45 投票
9 回答
89922 浏览
提问于 2025-04-16 22:32

我正在使用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

撰写回答