個人ニュースサイトの被はてなアンテナ数をRubyで計測してみた
Railsで個人ニュースサイトまとめサイトを作ってみようと思ったが、Parallels2さんのリンク切れてないサイトだけでも661サイトもあってカテゴリー分けしてる途中で萎えた。主に取り扱っているものが何なのかなんてぱっと見ただけじゃわからないっす。
ということで、簡単に調査が出来そうな被はてなアンテナ数から攻めて見ることにした。
結果*1
ソースコード
Parallels2さんからニュースサイトのリンクをCSVに抽出
require 'rubygems' require 'scrapi' require 'open-uri' require 'nkf' require 'csv' $KCODE = 'u' def get_newssites html = NKF::nkf('-w -m0', open('http://parallels.at-ninja.jp/').read) Scraper.define do process "dl > dt > a:first-child", 'matches[]' => {:name => :text, :url => "@href"} result :matches end.scrape(html, :parser_options => {:char_encoding => 'utf8'}) || [] end CSV.open('newssite.csv', 'w', "\t") do |writer| sites = get_newssites sites.each do |site| writer << [site[:name], site[:url]] end end
簡易リンク切れ/移転チェック
とプログラミング言語 Ruby リファレンスマニュアルを参考にしました。
require 'csv' require 'uri' require 'net/http' $KCODE = 'u' Net::HTTP.version_1_2 def fetch(uri, limit = 10) raise '引越しが多過ぎるので追跡を断念しました' if limit == 0 response = Net::HTTP.get_response(URI.parse(uri)) case response when Net::HTTPSuccess raise "引越し先は #{uri}" if limit < 10 when Net::HTTPRedirection fetch(response['Location'], limit - 1) else raise "リンク切れ?:#{response.code}:#{response.message}" end end CSV.open('newssite.csv', 'r', "\t") do |site| begin fetch site[1] rescue Timeout::Error retry rescue => e puts "#{site[0]}: #{site[1]} ⇒ #{e.message}" end end
被アンテナ数をCSVで出力
件数取得APIみたいなのあるかな〜と思ったけど、軽く探してみて見つからなかったのでscrapiに逃げ。
どうやらhttp://www.futilehope.net/とhttp://www.futilehope.netみたいに後ろの/があったりなかったりすると件数が違うっぽいので、適当に足してみる。
require 'rubygems' require 'scrapi' require 'open-uri' require 'nkf' require 'csv' $KCODE = 'u' def hatena_antena_counter(url) def antena_counter(url) hatena_antena = NKF::nkf('-w -m0', open("http://a.hatena.ne.jp/include?#{url}").read) count = Scraper.define do process 'div#hatena-antenna-include > h1', :count => :text result :count end.scrape(hatena_antena).to_s.match(/\((\d+)\)/).to_a[1].to_i || 0 end site_url = URI.encode(url.gsub(/\/$/, '')) antena_counter(site_url) + antena_counter(site_url + '/') end sites = Array.new CSV.open('newssite.csv', 'r', "\t") do |newssite| site = Hash.new site[:name] = newssite[0] site[:url] = newssite[1] site[:count] = hatena_antena_counter site[:url] puts "\"#{site[:name]}\",#{site[:url]},#{site[:count]}" sites << site sleep 1 end sites.sort! {|a, b| b[:count] <=> a[:count]} CSV.open('hatena_antena.csv', 'w', "\t") do |writer| sites.each do |site| writer << [site[:name], site[:url], site[:count]] end end
*1:上位100にしぼってあります。