RubyでWeb上からファイルをダウンロードする:open-uri

Ruby で、Webサイトから画像などのデータをダウンロードするのに使う open メソッドについて説明します。

openメソッドの使い方

Ruby には標準添付ライブラリとして、Webサイトなどに簡単にアクセスするための open-uri が用意されています。

require 'open-uri'
open(取得するURL) do |file|
  処理
end

openメソッドのサンプル

以下は、http://example.com/ からHTMLを取得し、取得したファイルの内容をreadメソッドで読み込み表示するサンプルです。

require 'open-uri'
url = 'http://example.com/'
open(url) do |file|
  puts file.read
end

また、ブロック構文を使わずに以下のように記述することもできます。

require 'open-uri'
url = 'http://example.com/'
file = open(url)
puts file.read

メタデータを取得する

また、取得したファイルではメタデータを取得するメソッドが使えます。

以下のように変数 file に取得したデータを入れます。

require 'open-uri'
url = 'http://example.com/'
file = open(url)

取得できるメタデータの例は、以下のようになります。

base_uri

puts file.base_uri
#=>http://example.com/

charset

puts file.charset
#=>utf-8

content_type

puts file.content_type
#=>text/html

last_modified

puts file.last_modified
#=>2013-08-10 08:54:35 +0900

meta

puts file.meta
#=>{"server"=>"nginx", "date"=>"Thu, 26 May 2016 09:21:55 GMT", "content-type"=>"text/html; charset=UTF-8", "transfer-encoding"=>"chunked", "connection"=>"keep-alive", "vary"=>"Accept-Encoding", "x-powered-by"=>"PHP/5.6.19"}

status

puts file.status
#=>200 OK

ファイルをダウンロードして保存する

次に取得したファイルをローカルに保存する方法について説明します。

コマンドラインから実行するので、以下のサンプルコードを download.rb というファイル名で保存してください。

require 'open-uri'
url, filename = ARGV[0], ARGV[1]

open(url) do |file|
  open(filename, "w+b") do |out|
    out.write(file.read)
  end
end

変数 ARGV[0], ARGV[1] は、実行するコマンドで指定する第1引数と第2引数を示します。

4行目でURLに接続し、5行目では書き出すファイル filename をオープンしブロック構文の中で、取得したファイルを読み込み・書き出しをしています。

コマンドラインから実行

以下のように、引数に http://example.com/logo.png と logo.png を指定し実行します。すると、コマンドを実行したディレクトリに、logo.png というファイル名で画像が保存されています。

$ ruby download.rb ruby ruby.rb http://example.com/logo.png logo.png
$ ls
  logo.png

ここで試したものは単純な構造のデータでしたが、もっと複雑な構造を持つデータの場合には’net/http’を使うと、ヘッダ部分やボディー部分などを分離して読み出すことができます。


イベント