2009年1月9日金曜日

download mass images 1

突然壁紙がたくさんほしくなったので、
壁紙がいっぱい集まっているところからちょいといただきます。

少し眺めていれば、以下のURLのように連番が発見できます。
http://www.backgroundsarchive.com/backgrounds/9124

まあ、ざっと見て20000以下なので、そこからbashを使います。
まずは10ほどで試してみましょう。
% echo http://www.backgroundsarchive.com/backgrounds/{1..10}
なんかたくさん表示されましたね。
OK、続けて
% echo http://www.backgroundsarchive.com/backgrounds/{1..10}|xargs -n1 echo
Bravo! これで分かりましたね。

あとはBeautifulSoupでいただいてしまいましょう。

import sys, re, urllib
from urlparse import urlparse, urljoin
from BeautifulSoup import BeautifulSoup

def download(url):
print 'down '+url
urllib.urlretrieve(url, url[url.rfind('/')+1:])

def parse(url):
print 'parse '+url
soup = BeautifulSoup(urllib.urlopen(url).read())
a = soup('a', href=re.compile(r'^/images/pub/\d+/\w+\.jpg$'))
map(lambda a:download(urljoin(url, a.get('href'))), a)

if __name__ == '__main__':
parse(sys.argv[1])

wally.pyとでも命名して即実行。
% time echo http://www.backgroundsarchive.com/backgrounds/{1..10}|xargs -n1 python wally.py
echo http://www.backgroundsarchive.com/backgrounds/{1..10} 0.00s user 0.00s system 42% cpu 0.001 total
xargs -n1 python wally.py 1.52s user 0.84s system 3% cpu 1:16.55 total
うーむ、信じられないほど遅い。
ブラウザだと少し早いからUAによる制限でしょうか。
まあ、しょうがない。

同時にダウンロードしちゃえば早いじゃんというのは自然な発想です。
コネクションが多すぎるとダメって聞いたことがあるので6つぐらいにしましょう。
% time echo http://www.backgroundsarchive.com/backgrounds/{1..10}|xargs -n1 -P6 python wally.py
echo http://www.backgroundsarchive.com/backgrounds/{1..10} 0.00s user 0.00s system 40% cpu 0.001 total
xargs -n1 -P6 python wally.py 1.48s user 1.45s system 11% cpu 26.645 total
これで六本同時に走ります。
うん、多少早くなりましたね。

念のため、User-Agentをかえてみます。
こんなのをimport urllibの下に書いておけばいいでしょう。

class FFURLopener(urllib.FancyURLopener):
version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ja; rv:1.9.0.5) Gecko/2008120122 Firefox/3.0.5'
urllib._urlopener = FFURLopener()

そして実行
% time echo http://www.backgroundsarchive.com/backgrounds/{1..10}|xargs -n1 -P6 python wally.py
echo http://www.backgroundsarchive.com/backgrounds/{1..10} 0.00s user 0.00s system 45% cpu 0.001 total
xargs -n1 -P6 python wally.py 1.52s user 1.32s system 82% cpu 3.428 total
げええ。
というわけで最適化に教科書なし。
遅いところに適切に対応しましょう。

さて、単純な連番ならこれでいいのですが、今回は全件取るつもりはありません。
序盤を集めたところマーブルばっかりで、動物とか風景がもっとほしい。
トップ画面からクロールしてほしい画像の一覧を作ったほうが好みの画像が集まりそうです。
トップページを見ると21ジャンルほどありますね。
巡回して21ジャンルから100枚ずつぐらいのリストを作るプログラムを書いて、
% python wally.py http://www.backgroundsarchive.com/desktop/|xargs -n1 -P6 wget
でうまくいきそうです。

予想外に長くなってしまってので次回へ続く。

0 件のコメント: