新刊『Rubyによるクローラー開発技法』 が8/25に発売されましたが、
わずか10日で増刷のお知らせが届きました。

http://www.amazon.co.jp/dp/4797380357

たくさんの方々に買っていただき、とても嬉しいです。

本当にありがとうございます。

現在AmazonのRuby・プログラミング部門で1位です!

20140904173917.png
Fig1: Amazon1位!

クローラーというと、最初はマニアックなイメージがあり、
クローラー開発技法って地味だなぁと思っていました。

ところがフタをあけてみると驚いたことに
ランキング上位をキープし続けていました。

ネットの活用が必須になる中、クローラー開発技法は
世の中に求められているのだとひしひしと感じました。

個人用即席クローラー

ちなみに出版後、僕はちょっとした個人用クローラーを作りました。

まぐまぐのメルマガの読者数や、
はてなブックマーク数や、
サイトのアクセス数
を出力するものです。

とはいえ簡単な情報収集なので Anemone などは使わず、
curl でダウンロードして、正規表現で情報抽出するものです。

たとえば ログインページが example.com/login.php でフォームを入力し、
ログインした後に example.com/page-after-login.php を開くのは
以下のコマンドを実行します。

$ curl -c /tmp/cookie -F name1=value1 -F name2=value2 http://example.com/login.php
$ curl -s -b /tmp/cookie http://example.com/page-after-login.php

あとは、下のコマンドの出力結果のHTMLを解析すればいいだけです。

Parallel を使い複数のサイトを同時にアクセスすることで
高速化を図っています。

概略を載せると、こんな感じになります。

予め
$ sudo gem install nokogiri parallel
を実行してgemをインストールしておきましょう。

#!/usr/local/bin/ruby
require 'nokogiri'
require 'parallel'

class Site
  def self.inherited(subclass)
    (@subclasses||=[]) << subclass
  end

  def self.doit
    Parallel.each(@subclasses) {|c| puts c.new}
  end
end

class FooSite < Site
  def title() "タイトル" end
  def parse
    # ダウンロードして抽出したデータを返す
  end
  def to_s
    # 整形して表示する
    "#{title}: #{parse}\n"
  end
end

class BarSite < Site
  # 同様
end

Site.doit

ちょっとトリッキーですが、
Class#inherited というメソッドは、
サブクラスが登録されたときに実行されます。

Emacsでいうと フック に当たるものだと考えてください。

Site.inheritedにてサブクラスを @subclasses に登録し、
Site.doit でそれらのオブジェクトを生成して出力しています。

こうすることで、新しいサイトを追加するには
サブクラスとto_sメソッドするだけで済みます。

楽チン!

クローラーは情報収集の時間を短縮してくれるので、
情報収集に時間がかかっているプログラマはぜひとも
本書を読んでみてください。

本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。