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