在pycurl中记录和使用cookie
我需要下载一个在密码保护页面上的文件。要手动访问这个页面,我首先得通过一个普通的登录页面进行身份验证。我想用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')
(在第二个请求之前)