Mechanizeとは
簡単にスクレイピングするためのgem
Mechanizeのインスタンスを作成し、.getメソッドでURLを文字列として渡すとページの情報をスクレイピングできる。そのままではデータとして扱いにくいのでsearchメソッドで要素を指定する。
例
agent = Mechanize.new
page = agent.get("http://hogehoge.com/")
elements = page.search('h2 a') # h2要素の下のa要素を検索
puts elements[0]
install
gemfileに以下を記述してbundle install
gem 'mechanize'
mechanizeの使い方
- Mechanizeのクラスインスタンスを作る。
- URLを渡してページを取得。
- ページから必要な情報を抜粋。
- 格納したいテーブルクラスのインスタンスを作成。
- whereでIDが既にあるかを調べる。
first_or_initializeでIDがない場合には新規に作成する。 - テーブルのインスタンスに代入(既知IDの場合は既知のデータを上書き)する。
- 最後にきちんと保存して終了。
agent = Mechanize.new
page = agent.get(URL)
id = page.search(クラスや属性等の要素指定)
name = page.search(クラスや属性等の要素指定) ...
table = Table.where(id: id).first_or_initialize
table.name = name
table.save
メインページから個別ページに移って、それから情報を取得するケースではメインページ側でLinks=[]などの配列に一旦URLを格納し、eachで分解しながら上記のメソッドを呼ぶ。
scrapingの実行
以下のようなscraping用のファイルがあるとして、(mode/scraping.rb)
実行するにはrails cでコンソールを起動して、
Scraping.get_irs
とクラスメソッドを実行させる。
class Scraping
def self.get_irs
url = 'https://www.nikkei.com/markets/kigyo/disclose/?kwd=&SelDateDiff=1'
agent = Mechanize.new
page = agent.get(url)
com = Company.where(name: page.search("//*[@id='IR1600']/tbody/tr[#{num}]/td[2]/a").inner_text).first_or_initialize
com.save
end
end
end
頻出メソッド
searchメソッド
htmlの要素を検索できる。なお取り出した要素は1つであっても配列で保存される。
クラス要素の指定は.class名とすると指定できる。
またXpathも指定できる。
get_attributeメソッドや.inner_textメソッドを使った際に、undefined method `get_attribute’ for #<Nokogiri::XML::NodeSet が出るようならsearchではなくat()を使う、もしくはeachでバラしてあげないと上手くいかない。
atメソッド
atメソッドはsearchメソッドと同じように使う。
違いはatの場合は一致する値を1つ取得した時点で処理を終了する。
inner_textメソッド
searchメソッドで得たHTML情報のテキストだけを取得したい場合、inner_textメソッドを使う。
elements.each do |ele|
puts ele.inner_text
end
get_attributeメソッド
aタグ要素の属性herfのようなURLだけ取得したい場合、get_attributeメソッドを使う。
get_attribute(属性)で指定した属性の値を取得する。
.get_attribute(属性)は[:属性]と簡略化できる。
elements.each do |ele|
puts ele.get_attribute('href') # puts ele[:href]としても良い
end
コメント