Rails で gem の mechanize を使ったスクレイピングを簡単にわかるようにまとめてみた
といえば python が主流のようだけど、
スクレイピングってそもそも何?っていうなら、データを抽出するってことなワケで
そんなワケだから、やることもやれることもそれだけ。
つまり
- インスタンスを作ってメソッドを使う
- メソッドでDOMを取得してノードを取り出す
これだけ。
ただ、これだけだとちょっと乱暴過ぎるので(汗
簡単な手順
- Mechanize.new でインスタンスを作る
- インスタンス.get でどのページでスクレイピングするのかを指定
- ページ.search(複数)ないしは .at(一つ)で要素を取得
- 要素.inner_text(内容)ないしは .get_attribute(属性)でブツを取得
これだけ。
ただ、これだけでもまだ乱暴過ぎるので(汗
思考の手順
- URL 構造、DOM を把握する
- 配列がキモ
要は、階層構造(ツリー)を抽出すること!
(ここで頭がゴチャゴチャになって挫ける人が多い印象。書き出してもいいと思う)
だいたいこんな感じ
あとは、配列!
配列の手順
- 親から子へと順番に
- each 文を使う。
親要素をまず配列として取得する
["親1","親2","親3" ... ]
each 文を使ってそれぞれの親の中で子を、さらに配列として取得する。
["親1["子a"," 子b", "子c" ... ]", ... ]
(親や子に URL があるケースが多いかと。もちろん URL を取得したい場合は孫に URL がくるケースもあり)
さらに子の中で each 文を用いて孫を、またまた配列として取得する。
["親1 ["子a ["孫悟空", "孫悟飯", "孫悟天", ... ]", ... ]", ... ]
(注:孫家はこの場合、兄弟です)
あとは DB にツッコむならモデルからインスタンス生成して入れればいいし、煮るなり焼くなりお好きなままに。
もちろん何重でも重ねることはできる。
こんな感じでしょうか。
あくまで理解の助けのためにと思っての記事なので具体的なコードとかは書いておりません。気軽な読み物として。