プログラマでありたい

おっさんになっても、プログラマでありつづけたい

複数並行可能なRubyのクローラー、「cosmicrawler」を試してみた

 最近のRubyのクローラーは、EventMachineを使って並列化するのが流行のようです。EventMachineは、非同期処理をお手軽に実装できるフレームワークです。Rubyのスレッド機能との違いは、Reactorパターンを使いシングルスレッドで実装している点です。こちらのブログが詳しいので参考になります。 「見えないチカラ: 【翻訳】EventMachine入門
 EventMachineを使うと、イベント・ドリブンの処理を簡単に実装出来ます。使い方は簡単ですが、通常の同期処理やスレッドをつかった処理に比べると、どうしてもコードの記述量は多くなります。今回の例である並列化してクローラーを走らせるという用途であれば、短時間で多くのサイトにアクセスするのが目的です。イベント・ドリブンで並列化処理を実装するのが目的ではないはずです。その辺りの面倒くさい処理を実装したライブラリがcosmicrawlerです。中身の実装を見てみると、非常にシンプルで解りやすいです。通り一遍ですが、インストールして試してみました。

cosmicrawlerのインストールとサンプルソース



 まずはcosmicrawlerのインストールですが、gem install cosmicrawlerだけで出来ます。直接依存するモジュールとしては、eventmachineとem-http-request、em-synchronyの3つです。付随的にaddressable、cookiejar、em-socksify、http_parserがインストールされます。

 それでは、サンプルソースを見てみましょう。公式にあったサンプルの取得先を、はてなのURLに変えただけです。

require 'cosmicrawler'

Cosmicrawler.http_crawl(%w(http://b.hatena.ne.jp/hotentry/it http://b.hatena.ne.jp/hotentry/life)) {|request|
  get = request.get
  puts get.response if get.response_header.status == 200
}

 実行してみると、すぐに結果が出てくると思います。取得するURLの付与の部分を作りこめば、すぐに使えそうな印象です。

クローラーの機能を考える



 前回、Masqueを紹介しました。Masqueは、Capybaraを使いJavaScriptの画面にも対応出来るというのが特徴です。今回のcosmicrawlerは、並列処理で高速化できるのが特徴です。どちらも、データを取得するという機能に特化したクローラーです。


 クローラーの主な機能としては、以下の3つがあります。

  • データ取得 … データをダウンロードする機能。robots.txtに従うかの判断も必要。
  • データ解析 … HTMLをパースする機能。HTML中からリンクを抽出して、再帰処理などにも利用する
  • データ保存 … 取得したデータを保存する機能。ファイルの他に、RDBMSやNoSQLを使うパターンもある。


 上記の機能を全て揃えているRubyのクローラーのライブラリとしては、今のところはanemoneしか知りません。一方で、データ取得以外の部分については、それぞれのクローラーが独自で実装する必要性は薄いです。例えば、robots.txtで禁止されているかのチェックは専用のライブラリがあれば良いし、HTML中からURLを抜き出して再帰処理する部分もライブラリとして外出し出来そうです。またHTML解析の部分も、NokogiriなどのHTMLパースのライブラリを使うことが多いです。この辺りを疎結合に使えるパターンを思案中です。あるいはAnemoneをクローラーのフレームワークとみなして、データ取得部分のみを切り替えられるように変更を加えるのも面白いかもしれませんね。


See Also:
オープンソースのRubyのWebクローラー"Anemone"を使ってみる
JavaScriptにも対応出来るruby製のクローラー、Masqueを試してみる
あらためてRuby製のクローラー、"anemone"を調べてみた


参照:
Rubyで複数並行なクローラをすっきりと書けるライブラリ「cosmicrawler」をgemとして公開した
見えないチカラ: 【翻訳】EventMachine入門
PythonとかScrapyとか使ってクローリングやスクレイピングするノウハウを公開してみる! - orangain flavor


Rubyによるクローラー開発技法

Rubyによるクローラー開発技法

Spidering hacks―ウェブ情報ラクラク取得テクニック101選

Spidering hacks―ウェブ情報ラクラク取得テクニック101選