gemを使った開発!Ruby on Railsでクローラーを使う方法【初心者向け】

初心者向けにRuby on Railsでクローラーを使う方法について解説しています。いろんなサイトから多くの情報を取得するといった手動ではできないことを行うことができます。実際にgemを使いながら説明しているので、ぜひご覧ください。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

RubyのフレームワークのRuby on Railsでクローラーを使う方法について解説しています。

分析ツールなどいろんな情報をひとつのサイトにまとめたいという時に便利です。クローラーでは、手動ではできないことをできるので、その面白さを感じるはずです。

 

なお本記事は、TechAcademyのWebアプリケーションオンラインブートキャンプの内容をもとに紹介しています。

 

大石ゆかり

田島メンター!!クローラーというのは何ですか〜?

田島悠介

Webサイトから情報を習得するプログラムのことを言うんだ。

大石ゆかり

例えばどんなときに使うんですか?

田島悠介

たくさんの量のデータを収集したり、それを分析したりするのにもクローラーは利用することができるよ。まずは必要なライブラリを紹介しよう。

 

クローラーとは

Rubyを勉強しているとクローラープログラムという言葉を見かけることがあります。

このクローラーというのは、Webサイトを巡回して情報を取得するプログラムのことを言います。

クローラを使用すれば、Yahooの最新ニュース情報を取得したり、facebookのタイムライン情報を取得するなど便利な機能を作成することができます。人がブラウザを操作して情報を収集するより、手間を省いて効率的に情報を取得することができますね。

ただクローラはWebページに負荷をかける行為なので使用する際は注意して使用するようにしましょう。

また、サイトによっては、APIを代用して情報を取得できるように用意していることも多いので、何かの情報を取得したいとおもった場合、まずはAPIが無いか調べるようにしましょう。

 

使用する主なライブラリ

前提条件として、Railsアプリケーションが作られていることとします。Railsアプリケーションの作り方は、Ruby on Railsなどを参考にしてください。

それでは、クローラーを実装する前にクローラーで使用するライブラリの紹介をします。

open-uri

open-uriは指定したurlにアクセスするためのライブラリです。

このライブラリがないとまずWebページにたどり着くことができないため、必須のライブラリとなっています。

nokogiri

nokogiriはスクレイピング、クローラーで頻繁に使用されるライブラリです。

取得したHTMLの任意の部分だけ抜き取ったり、string型に変換したりできます。

 

これらのライブラリを使用するには、Railsアプリケーションフォルダの直下にある「Gemfile」ファイルに以下を追記し、コンソールから「bundle install」を実行します。

gem 'nokogiri'

※open-uri は Ruby on Rails 標準ライブラリのため、Gemfileへの追記は不要です。

 

大石ゆかり

このふたつのライブラリが必要になるわけですね。

田島悠介

これらをrequireで読み込んで、クローラーのプログラムを作成するよ。実際に書いてみよう。

大石ゆかり

はい!

 

[PR] Rubyのプログラミングで挫折しない学習方法を動画で公開中

情報を取得する方法

今回はRuby on Railsを用いて、Yahooのトップ情報を取得するクローラープログラムを作成していきたいと思います。

初めに、コントローラーを作成します。コンソールで以下のコマンドを入力します。

rails generate controller yahoos

 

次にそれぞれのファイルを下記のように記述していってください。

app/controllers/yahoos_controller.rb

class YahoosController < ApplicationController
 require "open-uri"
 require "nokogiri"
 
 def index
   uri = "http://www.yahoo.co.jp/"
   @doc = Nokogiri::HTML(open(uri),nil,"utf-8")
 end
end

app/views/yahoos/index.html.erb

<%= @doc %>

 

config/routes.rb

Rails.application.routes.draw do
 get 'yahoos/index'
end

 

yahoos/indexページ内を開くと以下のようにyahooのトップページのHTML情報が表示されます。ブラウザで見るのと違い、生のHTML情報なので、HTMLソースが表示されていますね。

 

それでは詳しく見ていきましょう。

Yahooのトップページから情報を取得してきているのは、app/controllers/yahoos_controller.rbファイルのindex関数内にある以下の記述です。

以下では、指定したURIの情報を取得し、viewで表示するために@doc変数に格納しています。

uri = "http://www.yahoo.co.jp/"
 @doc = Nokogiri::HTML(open(uri),nil,"utf-8")

 

app/views/yahoos/index.html.erbでは、@doc変数の内容を表示しています。

<%= @doc %>

 

 

それでは、index.html.erbを修正し、@docから必要な要素を抽出してみましょう。

@doc変数には、HTML情報が文字列としてではなく、構造化されたHTML文章として取得されています。そのためnokogiriでは、CSSセレクタを使って要素を指定することができます。

それでは、Yahooトップページから、リンク要素の一覧を取得してみましょう。

「@doc.css(“a”)」と書くことで、@doc変数に格納されたリンク要素(aタグ)の一覧を取得できます。

<%
@doc.css("a").each do |link|
  # concatは、文字列をそのまま出力する関数です
  # link.textは、link要素(この場合はaタグ)の中の文字列を取得します。
  concat simple_format(h(link.text))
end
%>

実行すると以下のようになります。

少し改造してみましょう。

クローラーのプログラムでは、1つのページからリンク先の一覧を取得して、さらにそれらのリンク先のページに遷移してクロールを続けるという処理をよく作ります。

「link.text」の部分を「link[“href”]」と変更することで、リンク先の一覧を取得することができます。

<%
@doc.css(".topicsindex a").each do |link|
  concat simple_format(h(link["href"]))
end
%>

実行すると以下のようになります。

上記のようにyahooのトップページから、HTML情報を取得することができました。

 

これでクローラプログラムの実装は完了です。

 

まとめ

今回はクローラープログラムの実装を行っていきました。

プログラム的には少し難しい部分があると思いますが、理解すると強い武器になるので、ぜひ理解を深めていくようにしましょう。

 

田島悠介

rails sで実行して画面を見てみよう。

大石ゆかり

ボタンを押すと、情報が表示されましたね。

田島悠介

今回はRailsで実行ボタンを作る形でやったけれど、irbでもクローラーを使用することはできるよ。機会があったらやってみよう。

大石ゆかり

分かりました。ありがとうございます!

 

[お知らせ]TechAcademyでは初心者でも最短4週間でオリジナルサービスが作れるRuby on Railsオンラインブートキャンプを開催しています。