urllib2でCookieを使う

urllib2モジュールでCookieを使ったWebへのアクセスは以下のように行います。

import urllib2, cookielib
cj = cookielib.CookieJar()              # Cookieを格納するオブジェクト
cjhdr = urllib2.HTTPCookieProcessor(cj) # Cookie管理を行うオブジェクト
opener = urllib2.build_opener(cjhdr)    # OpenDirectorオブジェクトを返す
r = opener.open(url)

urllib2.build_opener( )はurllib2.BaseHandlerクラスまたはそのサブクラスのインスタンス(ハンドラオブジェクト)を引数に取ります。OpenDirectorオブジェクトは複数のハンドラを経由してリクエストの送信及びレスポンスの受信を行います。


実際にCookieの管理ができているかを確かめるために、ニコニコから動画を落としてみます。

>>> import urllib, urllib2, cookielib, re
>>>
>>> cj = cookielib.CookieJar()
>>> opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
>>>
>>> # ログインCookieを取得
... r = opener.open("https://secure.nicovideo.jp/secure/login",
...     "mail=%s&password=%s" % (mail, password))
>>>
>>> # FLVファイルのURLを取得
... r = opener.open("http://www.nicovideo.jp/api/getflv?v=" + flv_id)
>>> params = re.compile("([^&]+)=([^&]*)").findall(r.read())
>>> params = dict(params)
>>> flv_url = urllib.unquote(params["url"])
>>>
>>> # 動画ページのCookieを取得(FLVファイルのダウンロードに必要)
... r = opener.open("http://www.nicovideo.jp/watch/" + flv_id)
>>>
>>> # ファイルをダウンロード
... f = open(flv_id + ".flv", "wb")
>>> r = opener.open(flv_url)
>>> f.write(r.read())
>>> f.close()

きちんと落とせました。