在pycurl中记录和使用cookie

11 投票
3 回答
23154 浏览
提问于 2025-04-15 19:01

我需要下载一个在密码保护页面上的文件。要手动访问这个页面,我首先得通过一个普通的登录页面进行身份验证。我想用curl这个工具在脚本中获取这个页面。
我的脚本首先进行登录,看起来是成功的——从/login的PUT请求返回了200的状态码。但是,当我尝试获取我想要的页面时,却失败了,返回了500的错误。

我使用了一个“cookie jar”:

C.setopt(pycurl.COOKIEJAR, 'cookie.txt')

在详细模式下,我可以看到在获取我需要的文件时,cookie正在被交换。现在我的问题是:使用COOKIEJAR还有其他需要注意的地方吗?

3 个回答

2

wds说得对。

为了让你更明白,提供的选项是基于这个链接的内容:http://curl.haxx.se/libcurl/c/curl_easy_setopt.html(可以查看关于cookie快捷方式的部分)。

500错误是内部服务器错误……如果不清楚具体情况,很难确定这个问题是否是因为你的脚本造成的。我们可能不知道你是否没有传递页面所期望的其他数据(这和cookie无关),而且他们也没有做好错误处理!

jb

11

你应该先存储cookie,然后再从中读取:

C.setopt(pycurl.COOKIEJAR, 'cookie.txt')
C.setopt(pycurl.COOKIEFILE, 'cookie.txt')

这是curl --help返回的内容:

-b, --cookie STRING/FILE  String or file to read cookies from (H)
-c, --cookie-jar FILE  Write cookies to this file after operation (H)

看看这个示例:

def connect(self):
    '''
    Connect to NGNMS server
    '''
    host_url = self.ngnms_host + '/login'

    c = pycurl.Curl()
    c.setopt(c.URL, host_url)
    c.setopt(pycurl.TIMEOUT, 10)

    c.setopt(pycurl.FOLLOWLOCATION, 1)
    c.setopt(pycurl.POSTFIELDS, 'j_username={ngnms_user}&j_password={ngnms_password}'.format(**self.ngnms_login))
    c.setopt(pycurl.COOKIEJAR, 'data/ngnms.cookie')

    # c.setopt(c.VERBOSE, True)

    c.setopt(pycurl.SSL_VERIFYPEER, 0);
    session = c
    return session
15

我认为Curl会保存cookies,但你需要明确地使用它们。不过我只用过命令行界面。看了一下文档,我觉得你可能想试试:

C.setopt(pycurl.COOKIEFILE, 'cookie.txt')

(在第二个请求之前)

撰写回答