Mechanizeの使い方

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の使い方

  1. Mechanizeのクラスインスタンスを作る。
  2. URLを渡してページを取得。
  3. ページから必要な情報を抜粋。
  4. 格納したいテーブルクラスのインスタンスを作成。
  5. whereでIDが既にあるかを調べる。
    first_or_initializeでIDがない場合には新規に作成する。
  6. テーブルのインスタンスに代入(既知IDの場合は既知のデータを上書き)する。
  7. 最後にきちんと保存して終了。
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

コメント