scrAPIを試す。

30分プログラム、その155。Rubyのスクレイピングツールキット scrAPIを参考に、scrAPIを試す。

最初は、URLを入力すると何人がLivedoor Readerとかで購読しているかを表示するWebサービスを作るつもりだったんだけど途中で面倒になった。なので、コマンドラインツールでどうぞ。

対応してるのは、

の3つ。

使い方

$ ruby popluar.rb http://example.com/
Hatena Bookmark: 9
Livedoor Reader: 0
Fastladder     : 0

$ ruby popular.rb http://d.hatena.ne.jp/mzp/
Hatena Bookmark: 6
Livedoor Reader: 49
Fastladder     : 16

example.comをブックマークしてるひとがそこそこいて、驚きを隠せない。

ソースコード

#! /opt/local/bin/ruby
# -*- mode:ruby; coding:utf-8 -*-
#
# popluar.rb - check your site popular
#
# Copyright(C) 2007 by mzp
# Author: MIZUNO Hiroki <hiroki1124@gmail.com> 
# http://mzp.sakura.ne.jp/
#
# Timestamp: 2007/10/14 15:53:23
#
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Ruby itself.
#
require 'rubygems'
require 'scrapi'
require 'open-uri'
$KCODE='u'


def hatena_bookmark(url)
  bookmark = Scraper.define do
    process_first '.public-count' ,:public  =>:text
    process_first '.private-count',:private =>:text
    result :public,:private
  end

  entry = URI.parse "http://b.hatena.ne.jp/entry/#{url}"
  result = bookmark.scrape entry
  result.public.to_i + result.private.to_i
end

def hatena_rss
  rss = Scraper.define do
  end

  entry = URI.parse "http://r.hatena.ne.jp/feed/#{url}"
  rss.scrape(entry).to_i
end


def livedoor(url)
  livedoor = Scraper.define do
    process 'span.subscriber_count','multi[]'=>:text
    process '#subscribers-count','single'=>:text
    result :multi,:single
  end

  counts = livedoor.scrape URI.parse(url)
  if counts.multi then
    counts.multi.map{|s|
      s.sub(/\((\d+) users\)/,'\1').to_i
    }.inject(0){|a,b|
      a+b
    }
  elsif counts.single
    counts.single.to_i
  else
    0
  end
end

def livedoor_reader(url)
  livedoor "http://reader.livedoor.com/about/#{url}"
end

def fast_ladder(url)
  livedoor "http://fastladder.com/about/#{url}"
end

if __FILE__ == $0 then
  ARGV.each{|url|
    puts "Hatena Bookmark: #{hatena_bookmark url}"
    puts "Livedoor Reader: #{livedoor_reader url}"
    puts "Fastladder     : #{fast_ladder url}"
  }
end