Ruby で、Webサイトから画像などのデータをダウンロードするのに使う open メソッドについて説明します。
openメソッドの使い方
Ruby には標準添付ライブラリとして、Webサイトなどに簡単にアクセスするための open-uri が用意されています。
1 2 3 4 |
require 'open-uri' open(取得するURL) do |file| 処理 end |
openメソッドのサンプル
以下は、http://example.com/ からHTMLを取得し、取得したファイルの内容をreadメソッドで読み込み表示するサンプルです。
1 2 3 4 5 |
require 'open-uri' url = 'http://example.com/' open(url) do |file| puts file.read end |
また、ブロック構文を使わずに以下のように記述することもできます。
1 2 3 4 |
require 'open-uri' url = 'http://example.com/' file = open(url) puts file.read |
メタデータを取得する
また、取得したファイルではメタデータを取得するメソッドが使えます。
以下のように変数 file に取得したデータを入れます。
1 2 3 |
require 'open-uri' url = 'http://example.com/' file = open(url) |
取得できるメタデータの例は、以下のようになります。
base_uri
1 2 |
puts file.base_uri #=>http://example.com/ |
charset
1 2 |
puts file.charset #=>utf-8 |
content_type
1 2 |
puts file.content_type #=>text/html |
last_modified
1 2 |
puts file.last_modified #=>2013-08-10 08:54:35 +0900 |
meta
1 2 |
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
1 2 |
puts file.status #=>200 OK |
ファイルをダウンロードして保存する
次に取得したファイルをローカルに保存する方法について説明します。
コマンドラインから実行するので、以下のサンプルコードを download.rb というファイル名で保存してください。
1 2 3 4 5 6 7 8 |
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 というファイル名で画像が保存されています。
1 2 3 |
$ ruby download.rb ruby ruby.rb http://example.com/logo.png logo.png $ ls logo.png |
ここで試したものは単純な構造のデータでしたが、もっと複雑な構造を持つデータの場合には’net/http’を使うと、ヘッダ部分やボディー部分などを分離して読み出すことができます。