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()
きちんと落とせました。