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.rbclass 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.rbRails.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の記事のタイトルがズラーっと並んでいるのではないでしょうか??
