2010-06-12 61 views
4

我使用cookielib模塊來處理HTTP cookies在類似這樣的片段的方式用在Python 2.6 urllib2模塊時:存儲cookielib餅乾在數據庫

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

我想存儲數據庫中的cookie。我不知道什麼更好 - 序列化CookieJar對象並存儲它或從CookieJar中提取cookie並存儲它。我不知道哪一個更好或者如何實現其中的任何一個。我應該也可以重新創建CookieJar對象。

有人可以幫我解決上述問題嗎?

在此先感謝。

回答

8

cookielib.Cookie,引用文檔字符串它(在其sources),

是故意一個非常簡單的類。 它只是擁有屬性。

因此pickle(或其他序列化方法)對於保存和恢復每個Cookie實例都很好。

至於CookieJarset_cookie套/添加一個cookie的情況下,__iter__(使用後者,只是做一個for環路上的罐子實例)返回其持有的所有cookie的情況下,一前一後。

您可以用來查看如何製作「數據庫上的cookie jar」的子類是BSDDBCookieJarmechanize的一部分,但我只是特指jar源代碼文件) - 它不會加載所有cookies,而是將它們保存在一個self._db這是一個bsddb實例(主要是磁盤上的,類似dict的哈希表被限制爲只有字符串作爲鍵和值),並使用pickle進行序列化。

如果你與操作過程中保持每一個cookie的內存,只需pickle荷蘭國際集團的罐子是最簡單的OK(當然,放BLOB在數據庫中,並從那裏拿回來,當你重新啓動) - s = cPickle.dumps(myJar, -1)爲整個jar(及其策略,當然不僅僅是cookie)提供了一個大字節字符串,並且theJar = cPickle.loads(s)在您重新加載s作爲數據塊中的blob後重建它。

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)