在Python请求中使用cookies.txt文件

在Python请求中使用cookies.txt文件,python,cookies,python-requests,cookielib,Python,Cookies,Python Requests,Cookielib,我正在尝试使用带有Python请求的cookies.txt文件(使用Chrome扩展名生成)访问经过身份验证的站点: import requests, cookielib cj = cookielib.MozillaCookieJar('cookies.txt') cj.load() r = requests.get(url, cookies=cj) 它不会抛出任何错误或异常,但会错误地生成登录屏幕。但是,我知道我的cookie文件是有效的,因为我可以使用wget成功地检索我的内容。知道我做

我正在尝试使用带有Python请求的
cookies.txt
文件(使用Chrome扩展名生成)访问经过身份验证的站点:

import requests, cookielib

cj = cookielib.MozillaCookieJar('cookies.txt')
cj.load()
r = requests.get(url, cookies=cj)
它不会抛出任何错误或异常,但会错误地生成登录屏幕。但是,我知道我的cookie文件是有效的,因为我可以使用
wget
成功地检索我的内容。知道我做错了什么吗

编辑:


我正在跟踪cookielib.MozillaCookieJar.\u确实加载了,并且可以验证Cookie是否被正确解析(即,它们具有
路径
安全
等令牌的正确值)。但是,由于事务仍然生成登录表单,似乎
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
字符串。您使用的插件生成的文件不包含这样的字符串,因此您必须自己插入它。我提出了适当的错误

编辑

会话cookie与0一起保存在第5列中。如果未将
ignore\u expires=True
传递到
load()
方法,则从文件加载时将丢弃所有此类cookie

文件
session\u 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

尽管我们设法将cookie放入上面的jar中,但是它们随后会被
cookielib
删除,因为它们在
expires
属性中仍然有
0
值。为了防止这种情况,我们必须将过期时间推迟到未来某个时间,如:

for cookie in cj:
    # set cookie expire date to 14 days from now
    cookie.expires = time.time() + 14 * 24 * 3600
编辑3

我检查了wget和curl,它们都使用
0
expiration time来表示会话cookie,这意味着这是事实上的标准。然而,Python的实现出于同样的目的使用空字符串,因此问题中提出了这个问题。我认为Python在这方面的行为应该与wget和curl的行为一致,这就是我在

我将注意到,在输入文件的第5列中用空字符串替换
0
s,并将
ignore\u discard=True
传递到
load()
是解决问题的另一种方法(在这种情况下不需要更改过期时间)。

我终于找到了一种方法使其工作(我是通过查看
curl
的详细输出得出这个想法的):我没有从文件中加载cookie,而是简单地创建了一个
dict
,其中包含所需的
值/名称对:

cd = {'v1': 'n1', 'v2': 'n2'}
r = requests.get(url, cookies=cd)

而且它起作用了(尽管它没有解释为什么以前的方法没有起作用).谢谢你的帮助,我真的很感激。

我试着把Piotr Dobrogost关于
MozillaCookieJar
的勇敢发现都考虑进去了,但是没有用。我受够了,自己只解析了那该死的
cookies.txt
,现在一切都好了:

import re
import requests

def parseCookieFile(cookiefile):
    """Parse a cookies.txt file and return a dictionary of key value pairs
    compatible with requests."""

    cookies = {}
    with open (cookiefile, 'r') as fp:
        for line in fp:
            if not re.match(r'^\#', line):
                lineFields = line.strip().split('\t')
                cookies[lineFields[5]] = lineFields[6]
    return cookies

cookies = parseCookieFile('cookies.txt')

import pprint
pprint.pprint(cookies)

r = requests.get('https://example.com', cookies=cookies)

这对我很有用:

from http.cookiejar import MozillaCookieJar
from pathlib import Path
import requests

cookies = Path('/Users/name/cookies.txt')
jar = MozillaCookieJar(cookies)
jar.load()
requests.get('https://path.to.site.com', cookies=jar)
<Response [200]>
从http.cookiejar导入MozillaCookieJar
从pathlib导入路径
导入请求
cookies=路径('/Users/name/cookies.txt')
jar=MozillaCookieJar(cookies)
jar.load()
请求。获取('https://path.to.site.com,cookies=jar)

相关:我使用这个扩展名:是的,我正在调用
load
,我已经在文件顶部添加了正确的头,但它仍然不起作用(我还尝试使用
urllib2
而不是
请求
)。这是一个完全的谜。@cjauvin请永远不要在没有任何警告的情况下放弃编造的代码。你的确切意思是什么?我在没有警告的情况下给出了什么“编造的代码”@cjauvin以下两行;
cj=cookielib.MozillaCookieJar('cookies.txt')r=requests.get(url,cookies=cj)
不包含对
.load()的调用
方法,您的代码中有这两行代码之间的某个地方。因此,这不是您的真实代码,而是一个虚构的代码。感谢您的更新!我充满了希望,因为您是对的:
ignore\u expires
参数确实起到了作用,但不幸的是,它仍然是相同的结果:无法登录。我想知道是否这是一种我可以比较
wget
与我的脚本所做的事情的方法(即在确切的HTTP事务方面)?我很高兴你没有问你想问的问题-“如何使用请求| urllib2 | Python发送cookies?”因为a)这已经被问到并得到了回答,b)我们有机会学习新的东西。:)