プログラマでありたい

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

オープンソースのRubyのWebクローラー"Anemone"を使ってみる

 Webサイトの調査をしようと思い、サイトクローラーが必要になりました。
各言語ごとに色々あるので何を使うか悩むところですが、Rubyでお手軽にということでAnemoneを採用しました。
ちなみに他の言語だと、下記のうちのどれかが良いのではないでしょうか?
Java:Nutch、S2Robot
Perl:Gungho
 余談ですが日本語で検索する場合、WEBクローラーで検索するかWEBスパイダーで検索するか悩みます。英語だとWeb SpiderかWeb Crawlerです。どちらかといえばWeb Spiderが一般的のようです。日本だとWEBクローラーの方が目的のものに辿り着きやすいような気がします。うーん、悩ましい。

Anemoneのインストール手順

Anemoneは、nokogiriを使います。
nokogiriが入っていれば、すんなりインストールも出来ると思います。
ちなみにnokogiriは、libxml2とlibxsltを必要とします。
ビルド用にヘッダーも必要になるので、併せてインストールしておいて下さい。

yum install -y libxml2 libxml2-devel libxslt libxslt-devel

nokogiriのインストール

# gem install nokogiri

anemone gemのインストール

# gem install anemone

Anemoneの使い方

Web上のサンプル通りに使えば、簡単に使えます。

require 'rubygems'
require 'anemone'

Anemone.crawl("http://www.example.com/") do |anemone|
  anemone.on_every_page do |page|
      puts page.url
  end
end


タイトルの取得はこんな感じ

Anemone.crawl("http://www.example.com/") do |anemone|
    anemone.on_every_page do |page|
      title = page.doc.xpath("//head/title/text()").first.to_s if page.doc
      puts title
    end
end


クローラーにオプション引数も渡せます。
この例ではユーザーエージェントの変更と、クロール間隔を変更しています。

  opts = {
    :user_agent => "AnemoneCrawler/0.00",
    :delay => 1,
  }
  Anemone.crawl("http://www.example.com/", opts) do |anemone|
    anemone.on_every_page do |page|
      url = page.url
    end
  end


中のオブジェクトに対して、色々な操作が出来ます。
ここではページ内のアウトバンドリンクの一覧をしています。

  Anemone.crawl("http://www.example.com/") do |anemone|
    anemone.on_every_page do |page|
      page.links().each {|link|
        puts "link," + url.to_s + "," + link.to_s
      }
    end
  end


詳しくはRDocをご参照ください。
またWebクローラーの何たるかを知りたければ、Spidering hacksがお薦めです。
Enjoy!!


See Also:
複数並行可能なRubyのクローラー、「cosmicrawler」を試してみた
JavaScriptにも対応出来るruby製のクローラー、Masqueを試してみる
あらためてRuby製のクローラー、"anemone"を調べてみた


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

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

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

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