Python版が古くなっていたので、Ruby版を参考にして美人時計の新仕様に対応したものを作ってみた。connection reset by peerが帰ってきたら間を置いてリトライさせたいんだけどなぁ。適当なやり方が思いつかない。Erlangだったら末尾再帰で奇麗にかけるかな。最後のsleepの引数は10前後のお好きな素数をお入れください。
import sys,os,urllib2,time opener = urllib2.build_opener() for h in range(24): for m in range(60): url = 'http://www.bijint.com/jp/img/clk/%02d%02d.jpg' % (h, m) request = urllib2.Request( url ) request.add_header( 'Referer', "http://bijint.com/jp/" ) try: file = open(os.path.basename(url), 'wb') file.write( opener.open(request).read() ) except: print "failed downloading", url finally: file.close() time.sleep(7)
ついカッとなってErlangでも書いた。escript hoge.erlってやってください。こっちもコネクション切られたら即死します。
fmt(I) when I < 10 -> lists:flatten( io_lib:format("0~p", [I]) ); fmt(I) when I >= 0 -> lists:flatten( io_lib:format("~p", [I]) ). getimg(0,0)-> do_get(0,0); getimg(Hour,0)-> do_get(Hour, 0), getimg(Hour-1, 59); getimg(Hour,Min)-> do_get(Hour,Min), getimg(Hour,Min-1). do_get(Hour,Min) when Hour >= 0 , Min >= 0 -> URL="http://www.bijint.com/jp/img/clk/" ++ fmt(Hour) ++ fmt(Min) ++ ".jpg", Referer = "http://bijint.com/jp/", timer:sleep(1024*7), try {ok, {_,_,Bin}}=http:request(get,{URL, [{"Referer", Referer}]}, [], []), ok=file:write_file(filename:basename(URL), Bin) catch _-> io:format("failed getting ~p~n", [URL]), do_get(Hour,Min) end. main([])-> application:start(inets), getimg(23,59), application:stop(inets).
追記:Erlangコードもtry/catchを入れてみた。こっちは画像の保存に成功するまで永久リトライ。しかしこれだと末尾再帰が保証されているか微妙な罠。
最新版はこちら。↓gistにもアップした。