gemを使った開発!Ruby on Railsでクローラーを使う方法【初心者向け】
初心者向けにRuby on Railsでクローラーを使う方法について解説しています。いろんなサイトから多くの情報を取得するといった手動ではできないことを行うことができます。実際にgemを使いながら説明しているので、ぜひご覧ください。
テックアカデミーマガジンは受講者数No.1のプログラミングスクール「テックアカデミー」が運営。初心者向けにプロが解説した記事を公開中。現役エンジニアの方はこちらをご覧ください。 ※ アンケートモニター提供元:GMOリサーチ株式会社 調査期間:2021年8月12日~8月16日 調査対象:2020年8月以降にプログラミングスクールを受講した18~80歳の男女1,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で読み込んで、クローラーのプログラムを作成するよ。実際に書いてみよう。
はい!
情報を取得する方法
今回は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オンラインブートキャンプを開催しています。