我正在尝试使用带有 Python 请求的 cookies.txt
文件(使用 Chrome 扩展生成)访问经过身份验证的网站:
import requests, cookielib
cj = cookielib.MozillaCookieJar('cookies.txt')
cj.load()
r = requests.get(url, cookies=cj)
它不会抛出任何错误或异常,但会错误地生成登录屏幕。但是,我知道我的 cookie 文件是有效的,因为我可以使用 wget
成功检索我的内容。知道我做错了什么吗?
编辑:
I’m tracing cookielib.MozillaCookieJar._really_load
and can verify that the cookies are correctly parsed (ie they have the correct values for the domain
, path
, secure
等标记)。但是由于交易仍然导致登录表单,似乎 wget
必须做一些额外的事情(因为完全相同的 cookies.txt
文件适用于它)。
原文由 cjauvin 发布,翻译遵循 CC BY-SA 4.0 许可协议
MozillaCookieJar
继承自FileCookieJar
在其构造函数中具有以下文档字符串:然后你需要调用
.load()
方法。此外,就像 Jermaine Xu 指出的那样,文件的第一行需要包含
# Netscape HTTP Cookie File
或# HTTP Cookie File
字符串。您使用的插件生成的文件不包含这样的字符串,因此您必须自己插入。我在 http://code.google.com/p/cookie-txt-export/issues/detail?id=5 提出了适当的错误编辑
会话 cookie 在第 5 列中以 0 保存。如果您不将
ignore_expires=True
传递给load()
方法,则在从文件加载时将丢弃所有此类 cookie。文件
session_cookie.txt
:Python 脚本:
输出:
0
编辑 2
尽管我们设法将 cookie 放入上面的 jar 中,但它们随后被
cookielib
丢弃,因为它们在expires
属性中仍然具有0
值。为了防止这种情况,我们必须将过期时间 设置 为将来的某个时间,如下所示:编辑 3
我检查了 wget 和 curl,都使用
0
到期时间来表示会话 cookie,这意味着它是事实上的标准。然而,Python 的实现出于相同目的使用空字符串,因此问题中提出了问题。我认为 Python 在这方面的行为应该与 wget 和 curl 的行为一致,这就是我在 http://bugs.python.org/issue17164 提出错误的原因我会注意到,在输入文件的第 5 列中用空字符串替换
0
s 并将ignore_discard=True
传递给load()
是解决问题的替代方法(在这种情况下无需更改到期时间)。