個人ニュースサイトの被はてなアンテナ数をRubyで計測してみた

Rails個人ニュースサイトまとめサイトを作ってみようと思ったが、Parallels2さんのリンク切れてないサイトだけでも661サイトもあってカテゴリー分けしてる途中で萎えた。主に取り扱っているものが何なのかなんてぱっと見ただけじゃわからないっす。
ということで、簡単に調査が出来そうな被はてなアンテナ数から攻めて見ることにした。

結果*1

順位 サイト名 被アンテナ数
1位 ミュージックマシーン 4937
2位 カトゆー家断絶 4833
3位 X51.ORG 4425
4位 アキバBlog(秋葉原ブログ) 2671
5位 朝目新聞-asame.com 2478
6位 変人窟 2457
7位 楽画喜堂 2309
8位 【2ch】ニュー速クオリティ-VIP- 2261
9位 ゴルゴ31 2227
10位 イミフwwwうはwwwwおkwwww 2114
11位 (・∀・)イイ・アクセス 1962
12位 海外ボツ!News 1926
13位 ザイーガ 1814
14位 セキュリティホール memo 1733
15位 Narinari.com 1686
16位 pya! 1673
17位 音楽配信メモ 1670
18位 everything is gone 1512
19位 情報考学 Passion For The Future 1487
20位 TBN 1484
21位 日刊スレッドガイド 1439
22位 放蕩オペラハウス 1373
23位 RinRin王国 1371
24位 萌えミシュラン 1367
25位 :::::HK-DMZ PLUS.COM 1279
26位 ▼TS | techside.net 1237
27位 小心者の杖日記 1155
28位 BRAINSTORM 1138
29位 ねたミシュラン 1082
30位 アルファルファモザイク 1076
31位 ぁゃιぃ(*゜ー゜)NEWS 1016
32位 エルエル 977
33位 面白いサイトを見つけたよ。 947
34位 好き好き大好きっ 911
35位 @JOJO 896
36位 まなめはうす 864
37位 かーずSP 841
38位 - BlackAsh - 829
39位 暗いニュースリンク 814
40位 ★てれびまにあ 788
41位 「最後通牒・こぼれ話」 739
42位 三度の飯より。 733
43位 なんでも評点 727
44位 hardでloxseな日々 683
45位 オレンジニュース 679
46位 連邦 670
47位 駄文にゅうす 661
48位 ぬるヲタが斬る 645
49位 すべらない名無し 641
50位 ひろぶろ 632
51位 ブログちゃんねる 623
52位 ウォッチ!声優板 609
53位 名前のない部屋 598
54位 酔拳の王 だんげの方 595
55位 OnlineSoft VersionUp.info 595
56位 独り言以外の何か 587
57位 駿河電力/スク水.jp 577
58位 ◆めっつぉ:スクウェア&デジタルニュース 572
59位 Goonie! 561
60位 useWill.com 556
61位 TricksteR 551
62位 同人ど〜らく 529
63位 もみあげチャ〜シュ〜 516
64位 習慣ベースボール 503
65位 ハムスター速報 2ろぐ 502
66位 えんにゅ〜す 478
67位 Tokyo Fuku-blog 462
68位 SUZUQ.NET 455
69位 古今東西製品情報 ― 思いでより、物でしょ。 453
70位 情報屋さん。 442
71位 Engadget Japanese 441
72位 Elastic 439
73位 From dusk till dawn “三丁偏愛” 434
74位 Re:戯言 430
75位 娘。楽宴 - モーニング娘。・ハロプロ・ソニンの応援娯楽サイト 426
76位 秒刊SUNDAY 423
77位 REVの日記@はてな 419
78位 RuputerFan 416
79位 サポティスタ 416
80位 小太郎ぶろぐ 415
81位 http://d.hatena.ne.jp/okaguchik/ 399
82位 今賀堂 398
83位 I've Sound Explorer 394
84位 萌えプレ 389
85位 DependSpace 383
86位 面白ニュース 382
87位 ugNews.net 377
88位 イレギュラーエレクトロン 358
89位 プリキュア様崇拝日記 358
90位 俺暇 358
91位 ある編集者の気になるノート 357
92位 和の心に酔いしれろ 356
93位 忍之閻魔帳 356
94位 bogusnews 347
95位 春屋 341
96位 Θケータイのアレ 337
97位 ジャニーズ最新情報。 337
98位 萌えよ!アキバ人ブログ 334
99位 Fresh News Delivery 334
100位 ★厳選!韓国情報★ 334

ソースコード

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

この結果をRubyで適当に置換して、順位付け&はてな記法化して完成。

*1:上位100にしぼってあります。