Rubyでスクライピングの処理を作るなら、Rubyの標準ライブラリの1つのopen-uriを利用し、openメソッドを利用します。ただし、HTMLには文字コードの違いによる文字化けが発生するなどの注意が必要なケースもあるので、正しい使い方が必要です。今回はopen-uriの機能とその使い方について解説します。
Rubyでスクライピングするには
自動的に外部のWebサイトにアクセスし、そのサイトから取得したデータを利用する技術をスクライピングと言います。このスクライピングをRubyで実現するには、外部のWebサイトにアクセスするためのライブラリを利用しなければなりません。
Rubyで外部のWebサイトにアクセスするためのライブラリとして標準で付属しているのがopen-urlです。open-urlについて解説する前に、スクライピングの基本について解説します。
スクライピングとは
今回取り上げるスクライピングとはWeb scrapingのことで、プログラムを使って外部のWebサイトにアクセスし、そのサイトから取得したHTMLを解析し、記載されている情報を利用する方法です。
例えば検索エンジンは、自動的にWebサイトにアクセスしてキーワードを抽出することで、利用者が検索したキーワードに合致するページを紹介しますが、これもスクライピングの一種です。
また他のサイトの情報を自社のWebサイトで活用するケースの他、自社のWebサイトを自動的にチェックするためのプログラムなどにも応用できます。
Rubyで外部サイトにアクセスするのは面倒
Rubyでファイルを読み込むには、IO.openメソッドを利用します。ファイルシステムにアクセスするためのIOクラスは標準で組み込まれているので、特別なライブラリを読み込むことから利用できます。
Rubyでスクライピングの処理を作るならネットワークにアクセスする機能を使い、外部のWebサイトにアクセスする機能を利用します。しかしこの機能はRubyの標準として組み込まれてはいません。そのため外部のライブラリを利用します。
RubyでWebサイトを開くには
Rubyにはネットワークを利用するための基本的な機能が組み込まれており、それを使ってHTMLを取得することが可能ですが、使い易いとは言えません。そこでファイルにアクセスするopenメソッドと同じように使える機能がopen-uriライブラリとして用意されています。
インターネットでRubyによるスクライピングを検索すると、nokogiriというgemライブラリとopen-uriライブラリがヒットします。このnokogiriというgemライブラリは、Webサイトにアクセスする処理にopen-uriライブラリをそのまま利用しています。
Rubyでスクライピング用のプログラムを作るには、open-urlライブラリの使い方を学んでください。
open-uriライブラリの使い方
open-uriライブラリは、Rubyでhttpプロトコル、またはftpプロトコルで外部のWebサイトにアクセスし、まるでファイルを読み込むようにHTMLを読み込む機能を提供します。
使い方はファイルにアクセスするopenと似ていますが、全く同じではありません。次からopen-urlライブラリとそれに含まれているURI.openメソッドの使い方を紹介します。
ライブラリ読み込み
open-uriライブラリの機能を利用するには、このライブラリを読み込まなければなりません。ソースファイルの中でrequireメソッドによりopen-uriライブラリを読み込んでください。
open-uriライブラリの読み込み方法
require 'open-uri'
ファイルのように取り込む
open-uriライブラリを利用して外部のWebサイトを取り込むには、URI.openメソッドを使います。最初の引数は参照したいWebサイトのURIで、さらに必要に応じてオプションの指定が指定です。
またURI.openメソッドで取り込んだHTMLは、URI.openメソッドに続けて記述するブロックでファイルと同じように扱えます。
URI.openメソッドの文法(ブロックを使う方法)
open(外部のWebサイトのURL) { |f|
処理
}
URI.openメソッドを使った例(ブロックを使う方法)
require 'open-uri' url = 'https://example.com' URI.open(url) { |f| f.each_line(|line| p line } }
この例ではURI.openでurlから取得したHTMLを、ブロック内の変数fに格納し、さらにeach_lineで1行ずつ変数lineに入れてそれを表示しています。
文字列として取り込む
先ほどブロックを利用して指定したWebサイトのHTMLを処理する方法を紹介しましたが、文字列として取り込み、それを処理することも可能です。
URI.openメソッドの文法(文字列として取り込む方法)
文字列変数 = URI.open(外部のWebサイトのURL)
URI.openメソッドを使った例(文字列として取り込む方法)
require 'open-uri' url = 'http://example.com/' file = URI.open(url) puts file.read
この例ではURI.openでurlから取得したHTMLを、文字列のオブジェクトfileに取り込み、readメソッドでその内容を表示します。
メタ情報にアクセスする
今回紹介しているURI.openメソッドを利用すると、指定したURLから取得したHTMLの他に、その属性やメタ情報なども取り出せます。なお属性に含まれる情報は、文字コードやヘッダに含まれる文字列です。
次からURI.openメソッドを利用してメタ情報を参照する方法を紹介します。
文字コードを取得する
Webページの表示に使われるHTMLは、パソコンのテキストエディタでも作成できます。もしWindows標準のメモ帳でHTMLを作成した場合、文字コードにUTF-8が使われているのをご存じでしょうか。他にもSJISやEUCなどの文字コードも使用可能です。
Rubyでは、プログラム内で使用する文字コードが設定されており、その文字コードと一致しないHTMLを読み込んでしまうと、文字化けにより誤動作することがあります。そのためHTMLを処理する前に文字コードをチェックし、必要なら文字コードを変換します。
URI.openメソッドでWebサイトを読み込んだ場合、そのメタ情報として文字コードの参照が可能です。次の例のように「charset」を指定して参照してください。
文字コードの参照方法
require 'open-uri' url = 'https://example.com' URI.open(url) { |f| p f.charset # 文字コードが表示される }
content_typeを取得する
WebブラウザからWebサーバーにアクセスした場合、HTMLの送信される訳ではありません。通信データに埋め込まれるデータもあります。その1つがcontent_typeです。content_typeによって受け取ったデータがHTMLか画像かを判定します。
URI.openメソッドでHTMLを取得した際、メタ情報としてcontent_typeを参照可能です。次の例のように「content_type」を指定して参照してください。
content_typeの参照方法
require 'open-uri' url = 'https://example.com' URI.open(url) { |f| p f.content_type }
metaタグの情報
最近のよく参照されるWebサイトのHTMLには、Googleなどの検索エンジンに評価してもらうための情報をmetaタグの中に記述しています。URI.openメソッドを利用すれば、このmetaタグに記述された情報をハッシュとして取り出すことが可能です。
meta情報をハッシュとして取り出すには下の例のように「meta」メソッドを使います。
metaタグの情報を取り出す例
require 'open-uri' url = 'https://example.com' URI.open(url) { |f| p f.meta }
まとめ
これまで解説したようにopen-uriライブラリを利用することで、外部のWebサーバーからHTMLを読み込む処理を作ることが可能です。そしてこの機能はRubyを利用したスクライピングやWebサイトに対する接続テストなどに利用できます。
ただしスクライピングで他社のサイトの情報を勝手に利用すると著作権の問題や相手のサービスを妨害する行為とみなされるなど、いろいろな問題が発生します。そのようなリスクがあることを理解したうえでopen-uriライブラリを利用してください。