如何在Python中多个请求中使用相同的cookie?

1 投票
1 回答
3808 浏览
提问于 2025-04-16 01:45

我正在使用这段代码:

def req(url, postfields):
    proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
    opener = urllib2.build_opener(proxy_support) 
    opener.addheaders = [('User-agent', 'Mozilla/5.0')]
    return opener.open(url).read()

来发送一个简单的HTTP GET请求(使用Tor作为代理)。

现在我想知道如何使用相同的cookie发送多个请求。

比如说:

req('http://loginpage', 'postfields')
source = req('http://pageforloggedinonly', 0)
#do stuff with source
req('http://anotherpageforloggedinonly', 'StuffFromSource')

我知道我的函数req还不支持POST请求,但我已经用httplib发送了POST字段,所以我想我可以自己搞定。不过,我不太明白怎么使用cookie。我看到的一些例子都是只处理一个请求的,我想在后续的请求中重用第一次登录请求的cookie,或者像curl那样从文件中保存和使用cookie,这样会简单很多。

我发的代码只是为了说明我想实现的目标,我想最终的应用会用httplib(2)。

更新:

cookielib.LWPCookieJar工作得很好,这是我为测试做的一个示例:

import urllib2, cookielib, os

def request(url, postfields, cookie):
    urlopen = urllib2.urlopen
    cj = cookielib.LWPCookieJar()
    Request = urllib2.Request

    if os.path.isfile(cookie):
        cj.load(cookie)

    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    urllib2.install_opener(opener)
    txheaders =  {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}

    req = Request(url, postfields, txheaders)
    handle = urlopen(req)
    cj.save(cookie)
    return handle.read()

print request('http://google.com', None, 'cookie.txt')

1 个回答

2

要实现这个功能,你需要用到 cookielib 模块。这里有一个很不错的 教程,里面有一些代码示例可以参考。

撰写回答