前回までのプログラミング学習コラムに続き12回目の勉強内容です。
文系エンジニアコラムの連載をさせていただいている小林寛和(ひろかず)です。Ruby on Railsのコラムの第12回目、最終回となります。前回はRubyGemsの説明をしたので、実際に実装して行きましょう。
Nokogiriを使ってみよう
Nokogiriとは?
NokogiriとはRubyGemsの名前です。一般的にはクローラーとして使われることが多いようです。Nokogiriの詳細に関しては、公式リファレンスを参照して下さい。
クローラーの注意点
クローラーを作ると、アプリに幅広さが出てきます。しかしながら、一歩使い方を間違えると相手側サイトに迷惑をかけるばかりか、ブロックされてしまったり、自らも被害を被ることもあるため、注意が必要です。
具体的には、
- 複数回のアクセスを行う場合は間隔を空けてアクセスする
- URLへのアクセス単位で毎回クロールする場合、クロールするサイトに大量アクセスが掛かる可能性があるため、アクセス単位ではなく時間単位のクローラーにする
- GoogleやYahoo等のサイトはクローラー(ロボット)からのアクセスはすぐにブロックする
- API等を公開しているサイトはAPIを使って代用する
などがあります。マナーが非常に大事ですので、「クローラー 注意点」等で検索し、調べた上で実行して下さい。
導入の準備
まずは作成中のRailsアプリケーションにNokogiriを導入することから始めましょう。
Gemfileの編集
アプリのホームディレクトリに移動し、Gemfileというファイルをエディタで編集します。具体的には、2行目以降の任意の場所に下記の記述を加えて下さい。
gem 'nokogiri'
その後、コマンドライン上から「bundle install」を実行します。しばらくするとbundleがインストールされます。もしこの時にgemが上手くインストールされなかった場合は「Gemfile.lock」を削除した後に再度bundle installを実行するとうまくいくかもしれません。
rails consoleで試してみる。
rails consoleコマンドを実行すると、Rubyで言うirbのようなものが立ち上がります。ここで「require “Nokogiri”」と入力して反応を見てみましょう。
無事「true」と表示されれば、Nokogiriが使えるようになっています。もしそうでなければエラーメッセージを見るなどして、何とかtrueが返ってくるようにして下さい。
コードを書いてみる
今回はトップページのURLでアクセスされた際に、内閣府公式ページの最新情報の一番上を拾ってくるという簡単な動作を実行してみましょう。
Controllerを編集
今回実際に動作を記述するのは、コントローラー内のindexメソッドです。
下記のようにメソッドを編集して下さい。
require "Nokogiri" require "open-uri" def index url = "http://www.cao.go.jp/" #sleep 5 doc = Nokogiri.HTML(open(url)) @topic = doc.css(".indexTopicsLink").first.children.first.text.strip end
コードの解説
順番に解説していきます。
1〜2行目にて、Nokogiriと、URLをオープンするために必要なopen-urlをrequireしています。メソッド内の1行目は見ての通りURLを変数に格納し、次の行でオープンからNokogiriによるparseを行なっています。
そして最後の行でCSSから最新トピックを指定し、その中のli要素の一番最初のものを抜き出し、余分な空白や改行を削除した後、Viewからこの情報を扱えるように@変数に格納します。(この時に「.first.children.first」となっているのは、サイトの仕様です)
View側の編集
View側では、@変数に格納された情報を表示するだけです。と言うより、この変数の中身はただのString型の文字列なので、適意表示してみて下さい。
ここまでやって実行すれば、TOPページにアクセスした時点でRailsアプリが内閣府のHPにアクセスを行い、自動的に最新トピッククロールし、最新情報を取ってきてくれる機能が動くはずです。
これを応用すれば、自動的に為替レートを拾ってきてくれて、日本円をリアルタイムでドルに変換してくれるアプリを作成できたり、結構色々なことが出来ます。
しかしながら、クローラーとはとても気をつけなければいけないものなので、上述した注意点等をしっかり守って下さい。
まとめ
最終回の今回はRails内にAPIを導入し、クローラーを作ることが出来ました。クローラーの作成時は最初の注意点をしっかり守り、注意して作成して下さい。