我正在尝试使用a访问经过身份验证的站点 cookies.txt
使用Python请求的文件(使用Chrome扩展程序生成):
import requests, cookielib
cj = cookielib.MozillaCookieJar('cookies.txt')
cj.load()
r = requests.get(url, cookies=cj)
它不会抛出任何错误或异常,但会错误地生成登录屏幕。但是,我知道我的cookie文件是有效的,因为我可以使用它成功检索我的内容 wget
。知道我做错了什么吗?
编辑:
我在跟踪 cookielib.MozillaCookieJar._really_load
并且可以验证cookie是否被正确解析(即它们具有正确的值 domain
, path
, secure
等等令牌)。但由于交易仍然导致登录表单,似乎 wget
必须做一些额外的事情(完全相同) cookies.txt
文件适用于它)。
MozillaCookieJar
继承自 FileCookieJar
在其构造函数中具有以下docstring:
Cookies are NOT loaded from the named file until either the .load() or
.revert() method is called.
你需要打电话 .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
:
# Netscape HTTP Cookie File
.domain.com TRUE / FALSE 0 name value
Python脚本:
import cookielib
cj = cookielib.MozillaCookieJar('session_cookie.txt')
cj.load()
print len(cj)
输出:
0
编辑2
虽然我们设法将饼干放入上面的罐子里,但随后它们也是如此 丢弃 通过 cookielib
因为他们还有 0
价值在 expires
属性。为了防止这种情况,我们必须 组 未来某个时间的到期时间如下:
for cookie in cj:
# set cookie expire date to 14 days from now
cookie.expires = time.time() + 14 * 24 * 3600
编辑3
我检查了wget和curl都使用了 0
到期时间表示会话cookie,这意味着它是事实上的标准。然而,Python的实现使用空字符串用于相同的目的,因此在问题中提出了问题。我认为Python在这方面的行为应该与wget和curl的行为一致,这就是为什么我在 http://bugs.python.org/issue17164
我会注意到更换 0
s在输入文件的第5列中使用空字符串并传递 ignore_discard=True
至 load()
是解决问题的另一种方法(在这种情况下无需更改到期时间)。
我终于找到了一种让它工作的方法(我通过观察得到了这个想法 curl
'详细的输出):我只是创建了一个。而不是从文件中加载我的cookie dict
与要求 value/name
对:
cd = {'v1': 'n1', 'v2': 'n2'}
r = requests.get(url, cookies=cd)
并且它有效(虽然它没有解释为什么以前的方法没有)。感谢所有的帮助,非常感谢。