クッキーの保存と読み込み(cookielib.FileCookieJar/LWPCookieJar)
pythonのurllib2で使ってクッキーの制御ができるようになったので、ファイルに読み込み・保存しようとdir(cookielib)すると、FileCookieJarなんつーそのものを発見。キタコレw
http://d.hatena.ne.jp/xanthus/20071204#p1のコードのcookielib.CookieJarを利用している箇所をFileCookieJarに修正して実行!
# 修正箇所 policy = cookielib.DefaultCookiePolicy( rfc2965=True, strict_ns_domain=DefaultCookiePolicy.DomainStrict, blocked_domains=["ads.net", ".ads.net"]) # cj = cookielib.CookieJar(policy) cj = cookielib.FileCookieJar(policy) >>> 実行 Traceback (most recent call last): File "<string>", line 74, in run_nodebug File "F:\File\Python\XXXXX.py", line 86, in <module> opener , cj = make_opener_with_cookie() File "F:\File\Python\XXXXX.py", line 51, in make_opener_with_cookie cj = cookielib.FileCookieJar(policy) File "D:\Python25\Lib\cookielib.py", line 1731, in __init__ raise ValueError("filename must be string-like") ValueError: filename must be string-like
なんじゃらほいと思ってソースを見る。
class FileCookieJar(CookieJar): """CookieJar that can be loaded from and saved to a file.""" def __init__(self, filename=None, delayload=False, policy=None): """ Cookies are NOT loaded from the named file until either the .load() or .revert() method is called. """ CookieJar.__init__(self, policy) if filename is not None: try: filename+"" except: raise ValueError("filename must be string-like")
なるほど、filenameが文字列っぽくないよと。良く見ると、第一パラメタがポリシー(DefaultCookiePolicy)じゃなくなってる。このfilename+""のチェックの仕方は上手い。覚えておこう。
とりあえず以下に修正。
# 修正箇所 policy = cookielib.DefaultCookiePolicy( rfc2965=True, strict_ns_domain=DefaultCookiePolicy.DomainStrict, blocked_domains=["ads.net", ".ads.net"]) # cj = cookielib.CookieJar(policy) cj = cookielib.FileCookieJar(None,False,policy) >>> 実行 Traceback (most recent call last): File "<string>", line 74, in run_nodebug File "F:\File\Python\XXXXX.py", line 97, in <module> cj.save("c:\\ml.cookie.log") File "D:\Python25\Lib\cookielib.py", line 1737, in save raise NotImplementedError() NotImplementedError
あれ?FileCookieJar.save()呼び出した所で落ちてるなぁとソースを確認すると・・・
def save(self, filename=None, ignore_discard=False, ignore_expires=False): """Save cookies to a file.""" raise NotImplementedError()
実装されてないww
FileCookieJarは何かのベースクラスになるのかなぁ。ちっ、ちゃんとリファレンス見るか。
追記
FileCookieJarの代わりにLWPCookieJarを使えばOK。
今回の場合、破棄されるように指示されていた(expiresが設定されてない)クッキーを保存したかったので、save()メソッドの第二パラメタにTrueを指示して強引に書き込んだw
追記(load()関係)
save()の第二パラメタにTrueを指定して保存したセッションクッキーはLWPCookieJar(file_name,True)で読み込まれない。
load()の第二パラメタにTrueを指定して明示的に読み込む必要がある。