在数据库中存储cookielib cookie

时间:2010-06-12 14:04:06

标签: python urllib2 cookielib

我使用cookielib模块在​​Python 2.6中使用urllib2模块时以类似于此代码段的方式处理HTTP cookie:

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

我想将cookie存储在数据库中。我不知道什么更好 - 序列化CookieJar对象并存储它或从CookieJar中提取cookie并存储它。我不知道哪一个更好或如何实现其中任何一个。我也应该能够重新创建CookieJar对象。

有人可以帮我解决上述问题吗?

提前致谢。

2 个答案:

答案 0 :(得分:9)

cookielib.Cookie,引用其文档字符串(在sources中),

  

故意是一个非常简单的课程。   它只是拥有属性。

所以pickle(或其他序列化方法)适用于保存和恢复每个Cookie实例。

对于CookieJarset_cookie设置/添加一个cookie实例,__iter__(使用后者,只在jar实例上执行for循环)返回全部它持有的cookie实例,一个接一个。

您可以用来查看如何在数据库上创建“cookie jar”的子类是BSDDBCookieJarmechanize的一部分,但我只是专门指向jar源代码文件) - - 它不会将所有cookie加载到内存中,而是将它们保存在self._db中,这是一个bsddb实例(主要是在磁盘上,dict-lookalike哈希表,仅限于将字符串作为键和值)和使用pickle进行序列化。

如果 确定在操作期间将每个cookie保留在内存中,只需pickle jar是最简单的(当然,将blob放入数据库并将其恢复从那里开始重新启动时 - s = cPickle.dumps(myJar, -1)为整个jar提供了一个大的字节字符串(当然,它的策略,不仅仅是cookie),theJar = cPickle.loads(s)一旦你重建了它已将s重新加载为数据库中的blob。

答案 1 :(得分: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)
相关问题