はてなブックマーク お気に入られ数ランキング (2010/11/05)

はてなブックマーク お気に入られ数ランキング (2010/09/23) - でぶぬる日記
前回と同様、はてなブックマークお気に入られ数ランキングを作ってみました。

前回と異なる点は以下の通りです。

総ブックマーク数の取得

各ユーザのRSSフィードに含まれる、"opensearch:totalResults" に、ユーザの総ブックマーク数が含まれているみたいですので、それを自動で取得してみました。

Ruby添付のRSS Parserでは(というか多分RSS Parser全般では)OpenSearch関連のタグは認識出来そうにないこともあり、NokogiriのXML Parserで無理やり読み込んであげています。

ついでなので今回は、総ブックマーク数のランキングも出しています。

最新ブックマーク日時の取得

非アクティブなユーザをランキングから除外する為に、最新のブックマーク日時も取得するようにしてみました。

生データ(CSVファイル)については、もしニーズがあれば公開したいと思います。@aquarlaまでお気軽にご連絡ください。

お気に入られ数のランキング

順位 ID お気に入られ 総ブックマーク
1 naoya 2095 7975
2 hatenabookmark 1590 92
3 otsune 1409 101074
4 jkondo 1386 3063
5 umedamochio 1325 12417
6 y_arim 1251 18240
7 kanose 1170 69190
8 Hamachiya2 1154 2667
9 amachang 1130 3628
10 fromdusktildawn 1100 10582
11 miyagawa 1059 24544
12 finalvent 954 31647
13 guldeen 928 35698
14 kensuu 870 11913
15 yuiseki 727 132765
16 REV 721 71506
17 ashitano244 689 5928
18 HolyGrail 664 21537
19 kokorosha 654 5110
20 koizuka 646 19599
21 ululun 621 38657
22 maname 590 69
23 secondlife 521 3986
24 pha 506 9359
25 complex_cat 474 24345
26 laiso 471 35142
27 nitoyon 470 6371
28 kanimaster 469 42167
28 netafull 469 3965
30 wacky 460 20895
31 kotorikotoriko 446 5068
32 nipotan 435 5435
33 higepon 434 3582
34 jt_noSke 431 56384
35 TAKESAKO 423 17117
36 wideangle 420 32149
37 mereco 410 3618
38 NATROM 403 6100
39 yamifuu 400 72746
40 ekken 397 19650
41 kyo_ju 396 24112
42 gotanda6 392 6429
42 antipop 392 8217
44 FTTH 390 26823
44 zu2 390 21505
46 Kamekiti 386 6771
47 westerndog 381 114225
47 kawasaki 381 11392
47 umeten 381 30752
50 tsupo 377 20516
51 Delete_All 373 4228
52 kawango 372 681
53 pollyanna 368 584
54 yto 367 2455
55 jazzanova 363 37057
55 lovelovedog 363 4626
57 FUKAMACHI 357 6074
58 ono_matope 353 9536
59 KoshianX 351 19242
60 yellowbell 347 6455
61 hatayasan 344 32433
62 myrmecoleon 331 27620
63 inumash 328 11339
64 kaitoster 326 11917
65 rikuo 324 16560
66 yachimon 313 31036
66 kurokuragawa 313 15309
68 lovecall 311 9902
68 vantguarde 311 18521
70 SeiSaguru 308 9451
71 hejihogu 303 33607
72 rna 302 18989
73 BUNTEN 298 14374
74 kusigahama 297 23004
75 noreply 296 262
76 girls_fashion 294 112454
77 hotomaru 290 16851
78 toya 288 21266
79 ryuzi_kambe 287 18031
80 hiroyukiegami 286 12937
81 retlet 285 54197
82 crow2008 281 12432
82 nkoz 281 80727
84 yappo 279 5833
84 WinterMute 279 10343
86 suVene 278 15356
87 feita 277 20144
88 yugui 276 13553
89 cho45 275 4036
90 b4-tt 271 63392
90 medtoolz 271 1624
92 mala 266 25
93 steam_heart 265 18771
94 n-styles 264 2604
95 essa 263 1684
95 feather_angel 263 11593
97 TakahashiMasaki 261 45273
98 massunnk 258 10944
99 blackshadow 257 12698
100 funaki_naoto 255 50175

総ブックマーク数のランキング

順位 ID 総ブックマーク お気に入られ
1 A410 134103 103
2 yuiseki 132765 727
3 toronei 126561 195
4 westerndog 114225 381
5 girls_fashion 112454 294
6 Naruhodius 111389 146
7 zephyr_82 109903 69
8 otsune 101074 1409
9 RanTairyu 86014 138
10 nkoz 80727 281
11 minazuki6 78468 139
12 pongpongland 77602 242
13 yamifuu 72746 400
14 REV 71506 721
15 ak9 71479 250
16 kanose 69190 1170
17 activecute 69021 236
18 Donca 64998 49
19 b4-tt 63392 271
20 solunaris149 63090 61
21 Nean 61069 175
22 bsiyo 56893 92
23 jt_noSke 56384 431
24 wackunnpapa 55160 142
25 retlet 54197 285
26 yuu-kuni 53140 213
27 funaki_naoto 50175 255
28 TakahashiMasaki 45273 261
29 kechack 44757 165
30 iriso 44340 13
31 pema 43868 84
32 kanimaster 42167 469
33 sankaseki 41832 190
34 CAX 41749 124
35 wartanenemon 39065 64
36 ululun 38657 621
37 kozai 37957 179
38 zyugem 37292 126
39 jazzanova 37057 363
40 cubisme_face 36973 32
41 giffie11 36584 58
42 cloverleaf24 36492 172
43 ore_de_work 36364 195
44 mosshm 36249 185
45 fs001493 36074 174
46 guldeen 35698 928
47 pc_nagomu 35317 75
48 bunoum 35184 109
49 zonia 35156 225
50 laiso 35142 471
51 advblog 34330 194
52 mikomiko77 33785 142
53 hejihogu 33607 303
54 nilab 33391 201
55 acqua_alta 33317 235
56 mickn 32985 67
57 brainparasite 32953 225
58 rosa_nera 32603 32
59 hatayasan 32433 344
60 wideangle 32149 420
61 akillerOKN 31945 116
62 nofrills 31838 162
63 finalvent 31647 954
64 toratorazero 31214 158
65 yachimon 31036 313
66 kashmir108 30756 141
67 umeten 30752 381
68 sassano 30652 120
69 rahoraho 30571 69
70 memoclip 30317 233
71 pho 30163 203
72 dododod 30027 149
73 gouzou 30026 138
74 Itisango 29446 55
75 denken 28350 176
76 myrmecoleon 27620 331
77 atasinti 27476 26
78 wanderingdj 27314 109
79 rekramkoob 27306 59
80 brax 27083 132
81 tailtame 27047 119
82 tarchan 26830 59
83 FTTH 26823 390
84 sarutoru 26638 45
85 mfluder 26629 43
86 sirouto2 26621 218
87 unproblematic 26596 80
88 kennak 26559 121
89 snow113 26450 52
90 colombo 26384 93
91 maple_magician 26374 26
92 F-name 26097 129
93 kiku72 25973 176
94 oguogu 25666 81
95 yomiusi 25518 64
96 sphynx 25272 36
97 kno 25241 70
98 s1090018 25184 138
99 Cat-Tram 25155 58
100 k_wizard 25136 102

ソースコードはこんな感じ

require 'open-uri'
require 'rubygems'
require 'json'
require 'rss'
require 'nokogiri'

usernames = ["aquarla"]
done_usernames = []

# お気に入られ数を取得
def get_followers(username)
  json_url = "http://b.hatena.ne.jp/#{username}/follower.json"
  open(json_url) do |f|
    JSON.parse(f.read)
  end
end

# はてブRSSをXMLとして取得
def open_hatebu_rss(username) 
  rss_url = "http://b.hatena.ne.jp/#{username}/rss"
    open(rss_url) do |file|
      yield file.read
    end
end

# XMLから最も新しいブックマークの作成時刻を取得
def get_latest_created_at(xml)
  RSS::Parser.parse(xml).items[0].date.localtime.strftime("%Y-%m-%d %H:%M:%S") rescue nil
end

# XMLから現在の総ブックマーク数を取得
def get_bookmark_count(xml)
  # Nokogiriは、namespaceを厳密に指定してあげないと動作しなかったりするみたい
  namespaces = {
    'opensearch' => 'http://a9.com/-/spec/opensearchrss/1.0/',
  }
  Nokogiri::XML.parse(xml).at('.//opensearch:totalResults', namespaces).text.to_i rescue -1
end

# メインルーチンはここから
while !usernames.empty?
  username = usernames.shift
  next if done_usernames.include?(username)
  begin  
    followers = get_followers(username)
    latest_created_at, bookmark_count = open_hatebu_rss(username) do |xml|
      [get_latest_created_at(xml), get_bookmark_count(xml)]
    end

    puts "#{username},#{followers.size},#{latest_created_at},#{bookmark_count}"

    STDOUT.flush
    sleep(5)
    followers.each do |f|
      usernames.push(f["name"])
    end
  rescue StandardError,Timeout::Error
    puts "#{username}"
  end
  done_usernames.push(username)
end