Ruby


ファイルをダウンロードする

今回は、ネット上のファイルをRubyを使ってダウンロードしてみましょう。
使いどころとしては、ダウンローダを使うほどではない簡単なダウンロード若しくは、 Rubyの正規表現を使ってダウンロードするファイルを生成してダウンロードする (この場合はファイルのリストを作るのにRubyを使って、ダウンロード自体はダウンローダに任せるべきだと思うが)若しくは、 自分なりの強力なダウンロードツールをつくるぜ!といった場合でしょうか。
ステキダウンロードツールができたら是非くださいね!というのは置いといて、
簡単に解説しますね。

001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022

#!ruby -Ks #2010/06/13 Shirao #指定したファイルをダウンロードするプログラム require 'open-uri' def save_file(url) filename = File.basename(url) open(filename, 'wb'){|file| OpenURI.open_uri(url, {:proxy=>nil}){|data| #プロクシは使わない puts "\t"+data.content_type #ダウンロードするファイルのタイプを表示 file.write(data.read) #ファイル名で保存 } } end open("download_task.txt", "r"){|io| while line=io.gets #line = filepath(url) line.chomp! print line save_file(line.chomp) end }

ポイント

open-uri

ヘルプを見ると、
http/ftp に簡単にアクセスするためのクラスです。
Kernel のモジュール関数(組み込み関数) open を再定義します。
とあります。
詳しいことはヘルプ等を見ていただくとして、今回はWeb上のファイルにアクセスするために(今回はhttpアクセスを扱います) これをrequireしてください。

取得したファイルの情報

今回は、OpenURI.open_uriして、結果をdataに渡しています。
そして、このdataの情報としてcontent_type(ファイルのタイプ)を取得して表示していますが、
このほかにも、
base_uri : リダイレクトされた後のデータが存在するURIをURIオブジェクトとして返す
charset : 文字コード情報を文字列で返す
content_encoding : Content-Encoding を文字列の配列として返す
last_modified : 最終更新時刻をTimeオブジェクトで返す
status : ステータスコードと reason phrase を文字列の配列として返す
といったMetaモジュールがあります。
これらは、htmlファイルをダウンロード(解析)するときに有用です。

ファイルの保存

保存するファイル名は filename = File.basename(url) で取得し、
data.read で、対象を取得し、file.write(data.read) で、読み込んだものを所定のファイルに書き込みます。
保存せず、取得したファイルを解析する場合は、data.readを変数にでも保存してごちゃごちゃしちゃってください。

プロクシ

今回はproxyは使わない設定にしましたが、簡単に使えるようにできます。
OpenURI.open_uri(url, {:proxy=>'アドレス:ポート'}),
のようにアドレスとポートを設定するだけです。

download_task.txt

単に保存したいファイルのアドレスを列挙してあるだけのファイルです。
http://〜〜〜/〜/hogehoge.jpg
http://www.〜/--/funi.png
といった感じに書いてあります

終わりに

今回扱ったのは、ファイルのダウンロードについてでした。
結構簡単にできますよね。
後はこれを使って何をするかですが、ファイル自体のダウンロードは他のダウンロードソフトに任せて、
Rubyには、htmlファイルを正規表現を用いるなどして解析して、目的のファイルのurlを取得することや
ソースを見ないと取得できない情報を得るために使うと便利だと思います。
Rubyの武器は強力なテキスト処理だと私は思います。
だからこそ、それを活かせるようなところに使うとステキなものが作れるんじゃないかと思います。
色々作ってみてください。

ソース

今回のRubyソースコードをおいておきます。


プログラムに戻る