並列HTTPダウンローダ
Erlang クエックブックを眺めていると、HTTPでデータを取得するサンプルがありました。httpモジュールを使うと簡単にできそう。ということでHTTPダウンローダを作ってみました。
仕様
せっかくなので複数プロセスで並列取得するようにしてみます。
- 引数で取得するURLの配列を受け取る。
- URLごとにプロセスを起動し、並列にHTTPでデータをダウンロード。
- 取得したファイルをカレントディレクトリに「<連番>.html」の名前で保存する。
実装
Erlang クエックブックを参考にさくっと実装。エラー処理をやってないとはいえ、かなりシンプルです。
-module(dl). -export([dl/1, dl0/2]). % 与えられたURLのデータをカレントディレクトリに保存する。 dl(List) -> dl(List, 1). dl([], _) -> ok; dl([First|List], I) -> spawn( dl, dl0, [First, I] ), dl(List, I+1). dl0( URL, I) -> File = integer_to_list(I) ++ ".html", io:format("download start. " ++ URL ++ "~n", []), {ok, {Status, Header, Body}} = http:request(URL), file:write_file( File, Body ), io:format("complete . " ++ URL ++ " -> " ++ File ++ "~n", []).
実行してみます。
3> dl:dl(["http://d.hatena.ne.jp/unageanu/","http://www.erlang.org","http://goo le.co.jp"]). download start. http://d.hatena.ne.jp/unageanu/ download start. http://www.erlang.org download start. http://google.co.jp ok 4> complete . http://www.erlang.org -> 2.html 4> complete . http://d.hatena.ne.jp/unageanu/ -> 1.html 4> complete . http://google.co.jp -> 3.html
ちゃんととれてきました!
補足:プロキシ設定について
HTTPで接続する際にプロキシを利用するには、「http:set_options(Options)」で設定する必要があります。
http:set_options([{proxy,{{"<プロキシホスト>", <プロキシポート>},["プロキシを使用しないホストの指定"]}}]).
例)
http:set_options([{proxy,{{"hogehoge.com", 80},["*.hogehoge.com"]}}]).
"プロキシを使用しないホストの指定"を省略するとリクエスト送付時にエラーになったのでご注意。