わーくあうと!

日々の作業でためになったことをアウトプットすることで自分の成長につながればなと。

pythonで画像保存(ログインもする)

あるサイトから数百枚の画像をがーっとダウンロードすることがあったので作業メモ。
サイトの作りとしては、一覧ページに小さい画像(サムネ)があってクリックすると画像詳細ページで大きな画像っていうよくあるパターン。欲しいのは詳細ページの大きな画像。

まずは画像URL作成

大きい画像のURLをがーっと作ってそのURL一覧をがーっとダウンロードしていけばいいかなーと思ったのでまずは大きい画像URLの一覧を作る。
今回はGoogleChromeのデバッガーのコンソールからjavascriptスクレイピングして必要な画像のURLリストを作った。
詳細画像のURLが「photo_detail.php?image_id=***」のような、image_idをphpスクリプトに渡すだけだったので画像一覧からdocument.getElementsByClassName("photo_box")とかでその画像をwrapする要素を適当に取得して、その要素内のimage_idらしきものを取得して大きい画像のURLに整形して〜って流れでURLリストを作成した。詳しいスクリプトは取得した画像サイトがバレてしまうので載せない。

画像ダウンロード

大きい画像のURLリストが完成したので、あとはそれをダウンロードをする。特に制約が無ければ「urllib.urlretrieve( url, output )」とかでダウンロードできてしまうんだけど今回はログインをしないと画像が見れないサイトで、このままだと0byteの空ファイルしかダウンロードされないのでログインもする。

ということでログイン処理もいれたら最終的には以下のようなスクリプトになった。
downloadPhotos.py

#!/usr/bin/python
#coding:utf-8

import urllib2
import os
import cookielib

URL_LIST = (
"http://画像のURL.jpg",
"http://画像のURL.jpg",
)

cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# ログイン処理.
r = opener.open("http://ほげほげ/login.php?id=fuga&password=hogehoge")

# あとはひたすらダウンロード.
for url in URL_LIST:
    print "get:%s" % (url)
    output = "./photos/%s.jpg" % os.path.basename(url)
    
    req = urllib2.Request(url)
    file = open(output, 'wb')
    file.write(opener.open(req).read())
    file.close()
    
    print "-> complete!! filesize:%s" % os.path.getsize(output)

もしこのまま使うときは途中のログインに必要な情報や、保存場所の指定は適宣書き換えてください。
で、実行。

$ cd downloadPhotos.pyの保存ディレクトリ
$ python downloadPhotos.py

わーいできたー