【发布时间】:2015-02-19 14:43:01
【问题描述】:
我正在编写一个 Python 2.7 脚本,使用请求来自动访问一个网站,该网站设置了两个具有相同名称但域不同的 cookie,例如命名为“mycookie”,域为“www.example.com”和“subdomain.example.com”。我的客户端脚本需要读取其中 一个 cookie 的值,并将其作为参数包含在后续请求中。因为requests.Session 中的 cookie 访问似乎仅由 cookie 名称键入,所以我看不到提取正确 cookie 值的方法。实际上,尝试使用该名称访问 cookie 会产生以下错误:
value = session.cookies["mycookie"]
File "/usr/lib/python2.7/site-packages/requests/cookies.py", line 276, in __getitem__
return self._find_no_duplicates(name)
File "/usr/lib/python2.7/site-packages/requests/cookies.py", line 326, in _find_no_duplicates
raise CookieConflictError('There are multiple cookies with name, %r' % (name))
requests.cookies.CookieConflictError: There are multiple cookies with name, 'mycookie'
这表明 Requests 的编写假设 cookie 名称在每个会话中都是唯一的。然而,正如所证明的那样,这不一定是正确的。
我想我可以通过维护两个会话并在它们之间手动复制其他重要的 cookie 来解决这个问题。但是,我想知道这是否是 Requests 的已知限制,如果是,推荐的解决方法可能是什么?
【问题讨论】:
-
.example.com的 cookie 对www.example.com也有效;所以你想要哪个饼干?您访问的是哪个网址? -
对不起,我弄错了,这两个域实际上是
www.example.com和subdomain.example.com。我会更新我的问题。两个 cookie 具有相同的名称,并由两个单独的 GET 请求设置,但第三个请求 POST 需要包含来自两者的 cookie 值。我认为问题可能是我正在尝试对两个域的请求使用单个 Requests.Session 对象。不幸的是,服务器在访问第二个时需要来自第一个的一些 cookie 数据,作为一种身份验证形式。网址不公开。 -
我已经使用两个
requests.Session对象管理了这个问题的解决方法,并将cookie 从第一个作为cookies=first_session.cookies参数传递给第二个second_session.get()调用。这允许为随后的第三个请求验证第二个会话。但是,我被设置Referer标头的问题绊倒了,我已经在另一个问题中介绍了这个问题。我认为对于我正在尝试做的事情来说,请求可能太高级了。
标签: python cookies python-requests