クッキーの保存と読み込み(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を指定して明示的に読み込む必要がある。