読者です 読者をやめる 読者になる 読者になる

美人時計からその日の画像をダウンロードしてくるスクリプト

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にもアップした。