Rails スクレイピングでデータを取得(getメソッド・searchメソッド編)備忘録


スクレイピングとは

  • 例えば、以下のようなHTMLのサイトがあった場合
index.html
<ul>
  <li>TEST1</li>
  <li>TEST2</li>
  <li>TEST3</li>
</ul>

<ul><li>の中にある「TEST1, TEST2, TEST3」等の値を取り出すことを言う。(ウェブサイト上のHTMLからある特定のデータを抜き出す処理のこと)

Mechanize

  • Mechanizeはスクレイピングを行うためのGemである。
  • Mechanizeクラスが使えるようになる。
  • Mechanizeクラスにはスクレイピングするための様々なメソッドが用意されている。

GemfileにMechanizeを追記(Railsの場合)

Gemfile
# 省略

gem 'mechanize'

bundle installすればOK

Mechanizeクラスで使うメソッドの紹介

HTML情報から指定のタグ要素の情報を検索する

searchメソッド

  • getメソッドで取得したページの情報が入ったオブジェクトに対して使用する。
  • 該当するHTMLのタグ要素が1つでも、返り値は配列の形式で返ってくる。

使い方

elements = Mechanize::Pageオブジェクト.search('セレクタ')

あるウェブページからh2要素のHTMLの情報を取得する場合

scraping.rb
agent = Mechanize.new
page = agent.get("http://sample.com/")
elements = page.search('h2') # h2要素を検索
puts elements
  • 出力結果(例)
<h2 class="entry-title index-entry-title">
<a href="/products/1" title="Single Post">sample1</a>
            </h2>
<h2 class="entry-title index-entry-title">
<a href="/products/2" title="Single Post">sample2</a>
            </h2>
<h2 class="entry-title index-entry-title">
<a href="/products/3" title="Single Post">sample3</a>
            </h2>
#以下略

h2要素の下のa要素のHTML情報を取得してみる

scraping.rb
agent = Mechanize.new
page = agent.get("http://sample.com/")
elements = page.search('h2 a') # h2要素の下のa要素を検索
puts elements
  • 出力結果(例)
<a href="/products/1" title="Single Post">sample1</a>
<a href="/products/2" title="Single Post">sample2</a>
<a href="/products/3" title="Single Post">sample3</a>
<a href="/products/4" title="Single Post">sample4</a>
# 以下略

このように、該当するHTMLのタグ要素全てが取得される。

  • 以下のようにするとsearchメソッドの返り値が配列の形式になっていることが確認できる。
test_scraping.rb
require 'mechanize'

agent = Mechanize.new
page = agent.get("http://sample.com/")
elements = page.search('h2 a') # h2要素の下のa要素を検索
puts elements[0]
  • 出力結果
ターミナル
<a href="/products/1" title="Single Post">Sample1</a>

以上のように返ってきた値の1番目の要素を取り出すことができるので配列の形式で返ってきていることがわかる。

まとめ

以上でmechanizeを使用したメソッドのうちgetメソッドsearchメソッドの2つを紹介しましたが今日は時間切れなので後日、他の使える便利なメソッドを紹介したいと思う。