個人ニュースサイトのRSS/Atom対応状況をRubyで計測してみた

一つ一つ手作業で調べるなんてやってられないのでRuby任せ。
とりあえずrubyforge.orgをFeedとかRSSとかで検索してみるとそれっぽいのを3つ発見。

上から順に比較

FeedDiscover

たまにHTMLがパースできなくて落ちる?

livedoor Feed Discover API

やたら早い、しかしなぜか取得するFeedが1件か0件で2件以上のものが取得できてない。使い方まちがってるんかな?

rFeedFinder

livedoor Feed Discover APIで1件しかとれてないものもしっかり取れる、しかし遅い。

計測してみる

livedoor Feed Discover APIとrFeedFinderを組み合わせて使ってみることにした。

require 'rubygems'
require 'logger'
require 'csv'
require 'rfeedfinder'
require 'livedoor/api/feed_discover'

$KCODE = 'u'

@log = Logger.new(STDOUT)
@log.level = Logger::INFO

def livedoor_feeddiscover(url)
  begin
    return Livedoor::API::FeedDiscover.find(url).feedlinks
  rescue Timeout::Error
    @log.error('livedoor_feeddiscover'){"Timeout::Error"}
    return []
  end
end

def rfeedfinder(url)
  begin
    return Rfeedfinder.feeds(url)
  rescue Timeout::Error
    @log.error('rfeedfinder'){"Timeout::Error"}
    return []
  end
end

sites = Array.new
CSV.open('newssite.csv', 'r', "\t") do |newssite|
  site = Hash.new
  site[:name]  = newssite[0]
  site[:url]   = newssite[1]
  feed_list    = livedoor_feeddiscover(site[:url]) | rfeedfinder(site[:url])
  site[:count] = feed_list.size
  site[:feeds] = feed_list.join(',')
  @log.info "\"#{site[:name]}\",#{site[:url]},#{site[:count]}"
  sites << site
end

sites.sort! {|a, b| b[:count] <=> a[:count]}
CSV.open('feed_list.csv', 'w', "\t") do |writer|
  sites.each do |site|
    writer << [site[:name], site[:url], site[:count], site[:feeds]]
  end
end

結果

661サイト中454サイトがFeed有り。こんな感じだろうか

Sample chart

最近Perl覚えたいと思いつつRubyで書いちゃうからさっぱり覚えられんなぁ・・・