LoginSignup
1
5

More than 5 years have passed since last update.

Ruby on Rails [学習記録-第15章-] Mechanizeの整理

Last updated at Posted at 2019-06-23

Mechanize

  • Mechanizeはスクレイピングを行うためのGem。
  • MechanizeのGemを入れるとMechanizeクラスが使えるようになる。
  • このMechanizeクラスにはスクレイピングをするための様々なメソッドが用意されている。
Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.5.1'

~中略~

gem 'Mechanize'
  • Gemをインストールするために、bundle installをする。
$ bundle install
  • まずMechanizeクラスのインスタンスを生成します。
agent = Mechanize.new # Mechanizeクラスのインスタンスを生成

getメソッド

  • getメソッドはMechanizeクラスのインスタンスメソッド。
  • get("スクレイピングしたいウェブサイトのURL")と引数にURLの文字列を指定することで、そのURLのウェブサイトのHTMLを取得する。
agent = Mechanize.new
page = agent.get("http://review-movie.herokuapp.com/") # HTMLを取得
puts elements
  • 出力結果は以下のようになる。
  • ここで取得できたpageは単なるHTMLの文字列ではなくそのウェブサイトのHTMLの情報を持ったMechanize::Pageオブジェクト
puts page
# <Mechanize::Page:0x007fcdda803dd8>

searchメソッド

  • searchメソッドはgetメソッドで取得したページの情報が入ったオブジェクトに対して使用。
  • これにより取得したウェブサイトのHTML情報の中から指定したHTML要素の内容を検索できる。
  • 該当するHTMLのタグ要素が1つでも、返り値は配列の形式で返ってきくる。
elements = Mechanize::Pageオブジェクト.search('セレクタ')
agent = Mechanize.new #Mechanizeクラスの作成
page = agent.get("http://review-movie.herokuapp.com/") #getメソッドでMechanize::Pageオブジェクトを取得
elements = page.search('h2') #searchメソッドでh2要素のHTMLの情報が取得
<h2 class="entry-title index-entry-title">
<a href="/products/1" title="Single Post">あのひと</a>
</h2>

<h2 class="entry-title index-entry-title">
<a href="/products/2" title="Single Post">海よりもまだ深く</a>
</h2>

<h2 class="entry-title index-entry-title">
<a href="/products/3" title="Single Post">ディストラクション・ベイビーズ</a>
</h2>

inner_textメソッド

  • searchメソッドで得られたHTML情報のテキストを取得したい場合、inner_textメソッドを使用する。
agent = Mechanize.new
page = agent.get("http://review-movie.herokuapp.com/")
elements = page.search('h2 a') # h2要素の下のa要素を検索

elements.each do |ele|
  puts ele.inner_text
end
あのひと
海よりもまだ深く
ディストラクション・ベイビーズ
少女椿

get_attributeメソッド

  • aタグ要素のHTMLはリンク先のURLを値とする属性hrefを持っている。
  • このようなHTMLの属性の値を取得したい場合、get_attributeメソッドを使う。
  • 同様にget_attributeメソッドを当てると以下のようになる。
agent = Mechanize.new
page = agent.get("ttp://review-movie.herokuapp.com/")
elements = page.search('h2 a') # h2要素の下のa要素を検索

elements.each do |ele|
  puts ele.get_attribute('href') # puts ele[:href]としても良い
end
/products/1
/products/2
/products/3
/products/4

atメソッド

  • searchメソッドは該当要素全てを取得するのに対して、atメソッドは該当1件のみを取得。

スクレイピングの流れ

  • Mechanizeクラスのインスタンスを生成。
  • Mechanizeクラスのインスタンスメソッドget(情報を取得したいウェブサイトのURL)で、ウェブサイトのHTML情報を取得。
  • 欲しいデータのあるタグ要素をsearchメソッドで指定して取得。
  • 取得したタグ要素のHTML情報にたいしてinner_textメソッド、またはget_attributeメソッドを使って欲しい値を取得。
1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5