たごもりすメモ

コードとかその他の話とか。

node.jsでHTMLスクレイピングをjQuery記法でやるライブラリみっつの比較

某イベントのためのコードを書くのにHTMLのスクレイピングをやりたいなー、nodeで書くかなー、去年は jsdom で書いたけど今はどうなんだろね、とか調べてたら、どうもこういうあたりのがあるらしい。

  • jsdom
    • たぶん一番有名で高機能、だけど重い。
  • node-jquery
    • jQuery読むだけならコレ!みたいな感じ、だけどあんまりアップデートされてないかも。使いかたはいちばんシンプル。
    • 依存関係がちゃんと書かれてなくて、追加で手で xmlhttprequest をインストールしておかないと動かなかった。
  • cheerio
    • お前ら重い! 俺がjQuery記法を再実装してやる! という男らしいライブラリ。
  • zombie
    • ブラウザの挙動をシミュレートする的なライブラリ、Mechanizeみたいなやつかな。いまの用途では前段でHTTPレイヤをいじる必要があるので今回は用途に合わない。
  • sqraper (追記)
    • ページをGETしてjQueryスクレイピングする、content-bodyを与えてparseするモードがない(必ずページURLを与える)ので今回は用途に合わない

どうしようかなと思ったけど、とりあえず速さが重要だったので簡単にベンチマークとった。適当な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:諸事情あってここで見せるわけにはいかない! 割と小さめのもの