node.jsでHTMLスクレイピングをjQuery記法でやるライブラリみっつの比較
某イベントのためのコードを書くのにHTMLのスクレイピングをやりたいなー、nodeで書くかなー、去年は jsdom で書いたけど今はどうなんだろね、とか調べてたら、どうもこういうあたりのがあるらしい。
- jsdom
- たぶん一番有名で高機能、だけど重い。
- node-jquery
- jQuery読むだけならコレ!みたいな感じ、だけどあんまりアップデートされてないかも。使いかたはいちばんシンプル。
- 依存関係がちゃんと書かれてなくて、追加で手で xmlhttprequest をインストールしておかないと動かなかった。
- cheerio
- お前ら重い! 俺がjQuery記法を再実装してやる! という男らしいライブラリ。
- zombie
- ブラウザの挙動をシミュレートする的なライブラリ、Mechanizeみたいなやつかな。いまの用途では前段でHTTPレイヤをいじる必要があるので今回は用途に合わない。
- sqraper (追記)
どうしようかなと思ったけど、とりあえず速さが重要だったので簡単にベンチマークとった。適当なHTML片*1をパースして jQuery 記法でidから特定の項目をひっぱってくる、という処理を100回繰り返す。
jsdomに与えるjQueryのファイルはローカルに用意して読み込んだ。
https://gist.github.com/3897132
MacBookAirでさくっと走らせたらこんな感じ。
$ node parse_bench.js jsdom:6734 in 100 times. jQuery:4403 in 100 times. cheerio:594 in 100 times. { err: null, results: [ 100, 100, 100 ] }
要するに cheerio がざっくり10倍速いですね!
まとめ
cheerioはjQuery記法再実装なので、欲しい処理(セレクタ等)が実装されていない可能性がある。使うときはリファレンスをまずよく読みましょう。
逆に言うと、サポートされている記法を使う限りでは cheerio がざっくり10倍速いのでこれを使っておくとよい感じ。コードも簡潔で jsdom のゴテゴテしい感じに較べるとすっきり。
node-jquery はメンテが怪しい割に特にそこまで速いわけでもない、ので避けておいていいかも。フルスペックのjQueryが欲しい場合、このくらいの差であれば jsdom を使えばいい気がする。jsdomを使う場合は jquery 本体のファイルはローカルに置いて文字列に読み込んでおくこと。
ただしparserの速度は対象のHTMLの構造やサイズ、および使用するjQueryセレクタなどによってだいぶ異なると思うので、自分のユースケースでちゃんと確認しましょう。
*1:諸事情あってここで見せるわけにはいかない! 割と小さめのもの