#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メソッドを使って欲しい値を取得。