課題
Rubyを利用して、インターネット上のファイルをダウンロードし、ローカルに保存したい場合はどのようにすればよいでしょうか?
解決策
まずはテキストファイルの例です。Wikipedia - HyperText Markup LanguageをHTMLファイルとしてダウンロードしたい場合は次のように書くと良いです。
require 'open-uri'
uri_str = 'https://ja.wikipedia.org/wiki/HyperText_Markup_Language'
URI.open(uri_str) do |res|
IO.copy_stream(res, 'HyperText_Markup_Language.html')
end
画像のようなバイナリでも同じです。Wikipedia - Portable Network GraphicsにPNGファイルの例としてあげられている画像をダウンロードしてみましょう。
require 'open-uri'
uri_str = 'https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png'
URI.open(uri_str) do |res|
IO.copy_stream(res, 'PNG_transparency_demonstration_1.png')
end
注意
open-uri
ライブラリはNet::HTTP``Net::HTTPS``Net::FTP
などのラッパーで、httpやhttpsのURLを一般的なファイルのように扱うことができます。このライブラリはKernel#open
を再定義するため、以下のように書くこともできます。
require 'open-uri'
uri_str = 'https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png'
open(uri_str) do |res|
IO.copy_stream(res, 'PNG_transparency_demonstration_1.png')
end
ただし、Ruby2.7からはopen-uri
により拡張されるKernel#open
を使って、URIを開くのは非推奨になりました。上記のコードをRuby2.7で実行すると、以下のような警告が出ます。
warning: calling URI.open via Kernel#open is deprecated, call URI.open directly or use URI#open
警告が出るだけで動かなくなったわけではないのですが、URI#open
やOpenURI#open_uri
を利用することをお勧めします。
環境情報
$ ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-darwin18