Ruby on Railsアプリでスクレイピングする方法を忘れないうちに どうも、Linです。アイスに移行してます。   「Ruby on Railsで他のウェブサイトからの情報を掲載できるアプリを作りたい」 そんな時におすすめなのが、 スクレイピング という技です。   スクレイピングとは、Wikipediaによると、

ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと
らしいですね。 なんと、そのウェブサイトから情報を抽出する技をRailsアプリでも実現できるというのです。 今日はこちらのQiitaの解説を見ることでスクレイピングをマスターできたきがするので、忘れないうちに書き留めておこうと思います。 スクレイピングの方法は、Mechanizeというgemを使った方法です。    

Ruby on RailsのアプリでMechanizeを使ってスクレイピングする方法

アプリ例として、freesworderの記事タイトルを取得するアプリを作ってみましょう。  

Step1. アプリを作る

まずは、スクレイピング用のRailsアプリを作ってみましょう。 新規Railsアプリの作成はrails newでしたね? 今回は「scraping」という名前のアプリを作成していきます。
$rails new scraping
   

Step2. アプリのディレクトリに移動

アプリ開発を進めるために、先ほど作成したscrapingというアプリのディレクトリに移動しちゃいましょう。
$cd scraping
 

Step3. コントローラー作成

Railsアプリの脳とも言えるコントローラーを作成していきます。 今回は適当にtopという名前のコントローラーを作ってみました。
$rails g controller top
 

Step4. コントローラー編集

続いて、スクレイピングのgemである「mechanize」をアプリに取り入れましょう。 Gemfileの最後に、
gem 'mechanize'
を追加。 そして、Gemfile編集後のおきまりの、
$bundle install
を実行してください。  

Step5. コントローラー編集

viewファイルでスクレイピングした変数を受け取れるように、コントローラーでスクレイピング用のデータを目的のサイトから引っ張ってきます。   まずは、topコントローラーに「home」というアクションを追加します。   top_cotnroller.rb
class TopController < ApplicationController
def home

end

end
  続いて、homeアクションにスクレイピング部分を追記。  
class TopController < ApplicationController


def home
  agent = Mechanize.new
page = agent.get("https://kensawai.com")
@elements = page.search('.entry-title')

end


end
  これは、agentという変数にMechanizeクラスのインスタンスを代入。 その後、pageという変数に「https://kensawai.com」というウェブサイトからHTML情報をgetというメソッドで、Mechanizeインスタンスから抜き出したものを代入します。   次に、@elementsというViewファイルでも使えるクラス変数に、「https://kensawai.com」のトップページにある「entry-title」というクラスのついてる要素を配列形式で入れて行ってます。 以上で、コントローラーの編集は終了です。    

Step6. ルーティング編集

先ほど定義したtopコントローラーのhomeアクションがviewページで確認できるようにルーティングファイルを編集します。   config/routes.rb
Rails.application.routes.draw do

root 'top#home'

end
  これでトップページに飛ぶと、homeアクションが実行されるというわけですね。  

Step7. Viewファイル作成で表示を確認

結果を表示するビューファイルを作成します。 home.html.erb というファイルをapp/views/top以下に作成。   スクレイピング情報を配列で綺麗に取り出せるように、home.html.erbを下記のように編集します。
<%@elements.each do|element|%>

  <p><%= element.inner_text%></p>

  <%end%>
   

Step8. 結果を確認

これで終了。 まずはテストサーバーを立ち上げます。
$rails s
この状態で、 http://localhost:3000/ にアクセスしてみましょう。   すると、こんな感じでfreesworderの記事のタイトルがズラーっと並んでいるのではないでしょうか??   rails スクレイピング   これは全然不吉な兆候ではなく、Railsアプリでスクレイピングに成功した証拠です。 Ruby on Railsアプリでスクレイピングにチャレンジしてみたい方は参考にしてみてくださいね。   それでは!   Lin]]>