【问题标题】:Requests CookieJar empty even thought the page have itRequestscookiejar 为空,即使页面有它
【发布时间】:2016-08-06 12:39:39
【问题描述】:

我在Python 3.5.1,使用requests,相关部分代码如下:

req = requests.post(self.URL, data={"username": username, "password": password}) 
self.cookies = {"MOODLEID1_": req.cookies["MOODLEID1_"], "MoodleSession": req.cookies["MoodleSession"]}

self.URL 有正确的页面,并且 POST 正在按预期工作,我打印了一些内容进行检查,结果通过了。

我的输出:

Traceback (most recent call last):
  File "D:/.../main.py", line 14, in <module>
    m.login('first.last', 'pa$$w0rd!')
  File "D:\...\moodle2.py", line 14, in login
    self.cookies = {"MOODLEID1_": req.cookies["MOODLEID1_"], "MoodleSession": req.cookies["MoodleSession"]}
  File "D:\...\venv\lib\site-packages\requests\cookies.py", line 287, in __getitem__
    return self._find_no_duplicates(name)
  File "D:\...\venv\lib\site-packages\requests\cookies.py", line 345, in _find_no_duplicates
    raise KeyError('name=%r, domain=%r, path=%r' % (name, domain, path))
KeyError: "name='MOODLEID1_', domain=None, path=None"

我正在尝试在运行时调试以检查 req.cookies 有什么。但我得到的是令人惊讶的,至少对我来说。如果您在self.cookies = {...} 上设置断点并运行[(c.name, c.value, c.domain) for c in req.cookies],我会得到一个空列表,就像里面没有任何cookie。

该网站确实发送了 cookie,使用 Chrome 扩展程序检查,我发现了 2,“MOODLEID1_”和“MoodleSession”,为什么我没有收到它们?

【问题讨论】:

  • req.headers 显示服务器发送了什么?那里有任何 Set-Cookie 标头吗?如果没有,那么服务器没有发送任何 cookie。
  • 我在req.headers 上没有找到任何Set-Cookie,但在Chrome 上我可以清楚地看到使用扩展程序的两个cookie。为什么我的脚本上看不到它们?
  • Cookies 总是从服务器发送到带有Set-Cookie 标头的客户端。 cookie 存在于 Chrome 中并不意味着它们是由您现在发布的 URL 设置的;它们可以由 不同的 URL 设置。您需要找到服务器发出 Set-Cookie 标头的 URL。
  • 嗯,好的,谢谢。请发布它,以便我标记正确答案。

标签: python cookies python-requests


【解决方案1】:

响应似乎不包含任何 cookie。在req.headers 中查找一个或多个Set-Cookie 标头。

存储在浏览器中的 Cookie 之所以存在,是因为响应中包含每个 Cookie 的 Set-Cookie 标头。您必须找到服务器设置这些 cookie 的响应;显然它不是这个响应。

如果您需要跨请求保留这些 cookie(一旦设置),请使用 requests.Session() object;这将保留响应返回的所有 cookie,并根据新请求将它们再次发送出去。

【讨论】:

  • 谢谢。 requests.Session() 就像一个魅力。事实上,这些 cookie 来自另一个 URL。
  • @0n10n_:答案解决了 OP 的问题。我不知道它是否能解决你的具体情况,因为你还没有告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
  • 1970-01-01
  • 2022-08-15
相关资源
最近更新 更多