将cookielib Cookies存储在数据库中

4 投票
2 回答
2718 浏览
提问于 2025-04-15 23:53

我正在使用 cookielib 模块来处理 HTTP cookies,配合 urllib2 模块在 Python 2.6 中使用,方式类似于下面的代码片段:

import cookielib, urllib2
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
r = opener.open("http://example.com/")

我想把这些 cookies 存储到数据库里。但是我不太清楚哪种方法更好——是把 CookieJar 对象序列化后存储,还是从 CookieJar 中提取 cookies 然后存储。我不知道哪种方法更好,也不知道该怎么实现这两种方法。我还希望能够重新创建 CookieJar 对象。

有人能帮我解决这个问题吗?

提前谢谢大家。

2 个回答

4

这是我实现的一个非常简单的类,它可以根据Alex的建议,使用pickle来从字符串中加载或保存cookie。

from cookielib import CookieJar
try:
    import cPickle as pickle
except ImportError:
    import pickle

class StringCookieJar(CookieJar):
    def __init__(self, string=None, policy=None):
        CookieJar.__init__(self, policy)
        if string:
            self._cookies = pickle.loads(string)

    def dump(self):
        return pickle.dumps(self._cookies)
9

cookielib.Cookie,根据它的文档描述,

这是一个非常简单的类。 它只是用来保存一些属性。

所以用 pickle(或者其他序列化的方法)来保存和恢复每个 Cookie 实例都是可以的。

至于 CookieJarset_cookie 方法用来设置或添加一个 cookie 实例,而 __iter__ 方法(要使用这个方法,只需对 jar 实例进行一个 for 循环)会一个接一个地返回它所包含的所有 cookie 实例。

你可以查看一个子类,了解如何制作一个“数据库中的 cookie jar”,这个子类是 BSDDBCookieJar(它是 mechanize 的一部分,但我特意指向了 jar 的源代码文件)——它不会把所有的 cookies 都加载到内存中,而是把它们保存在 self._db 中,这个 self._db 是一个 bsddb 实例(主要在磁盘上,像字典一样的哈希表,只能使用字符串作为键和值),并使用 pickle 进行序列化。

如果你可以接受在操作过程中将每个 cookie 都保存在内存中,那么简单地对 jar 进行 pickle 是最简单的(当然,你可以把这个数据放到数据库中,重启时再从那里取回来)——s = cPickle.dumps(myJar, -1) 会给你一个包含整个 jar 的大字节串(当然还包括相关的策略,不仅仅是 cookies),而 theJar = cPickle.loads(s) 则会在你从数据库重新加载 s 作为一个 blob 后重建它。

撰写回答