Serializing that convoluted cookielib.CookieJar
The Python
cookielib.CookieJar object is a very convenient feature to manage cookies automatically as you traverse a series of Http web requests back and forth. However, the data structure of the class is a convoluted collection of Python dict.cookielib.CookieJar has a _cookies property which is a dictionary of a dictionary of a dictionary of cookielib.Cookie.To understand the data structure in the
CookieJar object cj, try:for domain in cj._cookies.keys(): for path in cj._cookies[domain]: for name in cj._cookies[domain][path]: cookie = cj._cookies[domain][path][name] print domain, path, cookie.name, '=', cookie.value
However, the class-defined
__iter__ method makes the above effort unnecessary if you just want to find the value of a cookie. The __iter__ method returns a cookielib.Cookie object for each iteration. You can simply go:for cookie in cj: print cookie.domain, cookie.path, cookie.name, cookie.value # etc
If you want your
CookieJar to persist in a file that can later be read back to create a Cookiejar object, the following two methods should work. They require the cPickle and base64 modules.import cPicker, base64
def writeCookieJarFile(cj, cookieJarFile):
f = open(cookieJarFile,'w')
for domain in cj._cookies.keys():
serialized = cPickle.dumps(cj._cookies[domain])
f.write(base64.b64encode(serialized)+'\n')
f.close()
def readCookieJarFile(cookieJarFile):
cj = cookielib.CookieJar()
try:
with open(cookieJarFile,'r') as f: text=f.read()
except Exception as exception:
print "readCookieJarFile: %s" % exception
return
lines = text.split('\n')
for line in lines:
if line=='': continue
cookieObject = cPickle.loads(base64.b64decode(line))
firstCookie = cookieObject[cookieObject.keys()[0]].keys()[0]
domain = cookieObject[cookieObject.keys()[0]][firstCookie].domain
cj._cookies[domain] = cookieObject
return cj
Note that
cookieObject in the read method above is not a cookielib.Cookie object. It is a dictionary (keyed by domain) of a dictionary (keyed by path) of a dictionary of Cookie (keyed by name).
Comments