Rails で gem の mechanize を使ったスクレイピングを簡単にわかるようにまとめてみた

スクレイピング

 

といえば python が主流のようだけど、

rails で使いたいよね!ってなったので、ruby で。

 

スクレイピングってそもそも何?っていうなら、データを抽出するってことなワケで

そんなワケだから、やることもやれることもそれだけ。

 

つまり

 

  • インスタンスを作ってメソッドを使う
  • メソッドでDOMを取得してノードを取り出す

 

これだけ。

ただ、これだけだとちょっと乱暴過ぎるので(汗

 

簡単な手順

  1. Mechanize.new でインスタンスを作る
  2. インスタンス.get でどのページスクレイピングするのかを指定
  3. ページ.search(複数)ないしは  .at(一つ)で要素を取得
  4. 要素.inner_text(内容)ないしは .get_attribute(属性)でブツを取得

 

これだけ。

ただ、これだけでもまだ乱暴過ぎるので(汗

 

思考の手順

  1. URL 構造、DOM を把握する
  2. 配列がキモ

 

要は、階層構造(ツリー)を抽出すること!

(ここで頭がゴチャゴチャになって挫ける人が多い印象。書き出してもいいと思う)

 

だいたいこんな感じ

 

f:id:uehara55:20181107115942p:plain

 

あとは、配列!

 

配列の手順

  1. 親から子へと順番に
  2. each 文を使う。

 

親要素をまず配列として取得する

["親1","親2","親3" ... ]

 

each 文を使ってそれぞれの親の中で子を、さらに配列として取得する。

["親1["子a"," 子b", "子c" ... ]",  ... ]

(親や子に URL があるケースが多いかと。もちろん URL を取得したい場合は孫に URL がくるケースもあり)

 

さらに子の中で each 文を用いて孫を、またまた配列として取得する。

["親1 ["子a ["孫悟空", "孫悟飯", "孫悟天", ... ]", ... ]",  ... ]

(注:孫家はこの場合、兄弟です)

 

あとは DB にツッコむならモデルからインスタンス生成して入れればいいし、煮るなり焼くなりお好きなままに。

 

もちろん何重でも重ねることはできる。

 

こんな感じでしょうか。

 

あくまで理解の助けのためにと思っての記事なので具体的なコードとかは書いておりません。気軽な読み物として。