唯物是真 @Scaled_Wurm

プログラミング(主にPython2.7)とか機械学習とか

アドベントカレンダー2015はてブ数ランキング

2015年のアドベントカレンダーが終わったので、どのカレンダーと個別の記事がはてなブックマーク件数が多かったのか調べてみた

調査方法

QiitaとAdventarに登録してあるアドベントカレンダーのURLをクロールしてはてなブックマーク件数取得APIで調べる
sucrose.hatenablog.com

アドベントカレンダーのランキング

途中の時点で調べた結果よりも結構順位が変わっている

順位 カレンダー名 はてなブックマーク
1 Vim 2391
2 ピクシブ株式会社 2253
3 プログラミング大好きベーシック 2063
4 システムエンジニア 2032
5 第2のドワンゴ 1925
6 Shell Script 1647
7 freee Engineers 1537
8 ドワンゴ 1497
9 Yahoo! JAPAN Tech 1398
10 地方在住ITエンジニア(元・地方在住も可) 1271
11 gumi 1212
12 クソアプリ 1110
13 UI Design 1018
14 animateLAB 1018
15 JavaScript 950
16 Go その2 936
17 Go その3 900
18 CyberAgent エンジニア 884
19 仮想DOM/Flux 878
20 コーヒー 876
21 Math 874
22 クラウドワークス 847
23 Money Forward 841
24 おうちハック 793
25 PHP 792
26 さくらインターネット 763
27 KLab 735
28 MySQL Casual 711
29 MySQL 5.7の「罠」に狙われてもやられないための 706
30 エウレカ 698
31 Ruby 685
32 Google Cloud Platform 660
33 Electron 620
34 Web API 607
35 AWS サービス別 再入門 605
36 ギークハウス 581
37 Mackerel 578
38 人工知能 549
39 Go 546
40 Chainer 536
41 Elasticsearch 535
42 カレー 521
43 Webデザインセオリー 518
44 ゆゆ式 495
45 【その1】ドリコム 494
46 Java 493
47 Arduino 489
48 Perl 5 488
49 Splatoon 463
50 Machine Learning 451
51 iOS 451
52 リモートワーク 443
53 WordPress 436
54 TIS Engineer 435
55 【その2】ドリコム 430
56 slack 425
57 Windows & Microsoft技術 基礎 423
58 RPGツクールMV 418
59 KAYAC 413
60 Ansible 401
61 プログラマになりたい 398
62 Git 398
63 プログラマになりたい 386
64 日曜数学 386
65 セカイエ 382
66 Node.js 377
67 mixiグループ 377
68 Fablic 370
69 Raspberry Pi 368
70 iPhoneアプリレビュー 367
71 Livesense 365
72 Product Manager 357
73 RECRUIT MARKETING PARTNERS 355
74 KMC 355
75 退学 354
76 React.js 347
77 iPhoneとAndroidの特長 346
78 Blog Lovers 341
79 百合 338
80 Git その2 337
81 クローラー/Webスクレイピング 316
82 Linux 313
83 さだまさし x IT 297
84 pyspa 294
85 Pepabo 294
86 Zabbix 285
87 Docker 282
88 Swift 269
89 HashiCorp 269
90 Swift その2 268
91 Python その2 253
92 http2 248
93 #音ゲーマー達の発信所 (1枚目) 246
94 CircleCI 245
95 Haskell 242
96 ぱくたそ 230
97 ねとけん 229
98 リクルートライフスタイル 228
99 Emacs 228
100 KobeUniv 227

個別の記事のランキング

順位 記事名 はてなブックマーク カレンダー名
1 ITエンジニアの私が漁師の嫁になって離島に引っ越した結果... - hayashi_77のブログ 934 地方在住ITエンジニア(元・地方在住も可)
2 シェル芸 - 【たのしいな】様々なコマンド達を何も考えずにつないで遊ぶ - Qiita 915 Shell Script
3 30歳から始める数学 - Shoyan blog 799 Math
4 自宅で美味いコーヒーを淹れる | SOTA 750 コーヒー
5 Webサービス - プログラマ向けニュースキュレーションサービスを作ってみた話 - Qiita 652 第2のドワンゴ
6 初心者がAWSでミスって不正利用されて$6,000請求、泣きそうになったお話。 - Qiita 636 プログラミング大好きベーシック
7 Vim Mnemonic | Vim のコマンドの覚え方大全 - haya14busa 625 Vim
8 ネットワーク初心者の新卒がDockerでネットワークの勉強をしてみた|サイバーエージェント 公式エンジニアブログ 588 CyberAgent エンジニア
9 BigQueryで150万円溶かした人の顔 - Qiita 584 gumi
10 さくらインターネットの歴史 - さくらインターネット創業日記 567 さくらインターネット
11 Bash - そのシェルスクリプトもうちょっとシンプルに書けそう Tips集(Golf/シェル芸ではない) - Qiita 564 Shell Script
12 PHPを使いもせずDISってる君達へ - Qiita 562 PHP
13 クソアプリ作って転職活動した話 - イッツァハローワールド 555 クソアプリ
14 本物の golang を... 本物の Gopher を、お見せしますよ。 - Qiita 551 Go その2
15 日々の覚書: MySQL 5.7.4で導入されたdefault_password_lifetimeがじわじわくる 530 MySQL 5.7の「罠」に狙われてもやられないための
16 ChiChi - スマホを胸に挟むだけでカップ数が測れるアプリ 512 クソアプリ
17 『実践Vim』を読んで学んだ、おすすめVimデフォルト機能32個 - MyEnigma 511 Vim
18 GoogleCloudPlatform - Cloud Vision APIの凄さを伝えるべくRasPi botとビデオを作った話 - Qiita 511 Google Cloud Platform
19 エンジニアとして成長するべく私が実践している学習方法 - Qiita 477 Money Forward
20 Excel方眼紙を支える技術2016 - Qiita 463 システムエンジニア
21 WebAPI - Web APIにはJSONベースのフォーマットを使おう - Qiita 461 Web API
22 ダレずに開発を走り切る為の習慣 : KLabGames Tech Blog 459 KLab
23 闇雲にディズニー映画みたいなアニメーションを GUI に実装するのはもうやめよう - Qiita 457 UI Design
24 Vimとgitで俺たちの開発速度はさらに加速した - pixiv inside 442 ピクシブ株式会社
25 Adobe Creative SDK for ios が本当にやばい - Qiita 426 プログラミング大好きベーシック
26 障害対応方法 - システム障害と僕達はいかにして戦えば良いのか、障害対応について考えた - Qiita 422 プログラミング大好きベーシック
27 エンジニア経験がなくても自分でコード書いて起業する方法 - Qiita 421 freee Engineers
28 北米版ゆゆ式(Yuyushiki Complete Collection)の高度な英訳について - メモ帳DPA 405 ゆゆ式
29 Arduinoを自作して量産して販売する(超小型Arduino互換機 8pinoを例に) - Qiita 404 Arduino
30 マネジメント - あるエンジニアの緩慢な死、あるいはエンジニア35歳定年説。 - Qiita 399 クラウドワークス
31 【大規模スマホゲー】Python未経験エンジニアとの最初の1ヶ月OJTメモ - Qiita 399 gumi
32 PHP初心者が仕事で躓いた4つの罠 - pixiv inside 390 ピクシブ株式会社
33 Slackであまり知られていない便利機能一覧 - Qiita 384 slack
34 Obj-C → Swift コンバータをオープンソースで公開しました! - Yahoo! JAPAN Tech Blog 378 Yahoo! JAPAN Tech
35 SMTP - メール運用がロストテクノロジーになっていく話 - Qiita 372 クラウドワークス
36 インドのIT事情について - もろず blog 368 TIS Engineer
37 1年間真剣にJavaScriptに取り組んだ話 - Qiita 359 JavaScript
38 WiFi - スタートアップの「つながる」無線に必要な5つのこと - Qiita 351 freee Engineers
39 WordPressの侵入対策は脆弱性管理とパスワード管理を中心に考えよう | 徳丸浩の日記 349 WordPress
40 サクラエディタ上に Vim を実装した話 - tchsskのブログ 343 Vim
41 batch - 多い日も安心設計 - Qiita 342 システムエンジニア
42 二千万レコードあるテーブルへのalterをサービスを止めずに流す | All Your Bugs Are Belong To Ass 338 MySQL Casual
43 オブジェクト指向プログラミングとは結局なんなのか | 黒曜の吹き溜まり オブジェクト指向プログラミングとは結局なんなのか – 黒曜の吹き溜まり 329 第2のドワンゴ
44 わたしのデザインセオリー(写真マスク編) | デザイナーのイラストノート 329 Webデザインセオリー
45 GitHub にパスワードとかセンシティブなファイルを push してしまったときの対処法 - Qiita 323 Git その2
46 「3の100乗を19で割ったあまりは?」を4通りの方法で計算する - tsujimotterのノートブック 321 日曜数学
47 おぞましい欠損者の庭 - 山の心 321 ギークハウス
48 elasticの新プロダクト「Beats」シリーズに震える! - Taste of Tech Topics 317 Elasticsearch
49 JavaScript - 2015年までにWebのフロントエンドが辿ってきた道 - Qiita 310 JavaScript
50 メモリを使用する、とは – kekyoの丼 307 Windows & Microsoft技術 基礎
51 DeepLearning - ニコニコ動画の公開コメントデータをDeep Learningで解析する - Qiita 304 第2のドワンゴ
52 【都内近郊】超美味いおススメカレーベスト10をランキング形式で紹介する - 太陽がまぶしかったから 299 カレー
53 アプリ開発の落とし穴!iPhone・Androidリジェクト事例9選 | Code部 282 iPhoneとAndroidの特長
54 VirtualDom - 仮想DOMで魂が震えてから一年、仮想DOMとFluxの今 - Qiita 274 仮想DOM/Flux
55 LAMP環境(Linux,Apache,MySQL)の障害対応で最初のアタリをつけるための秘伝のタレ - Qiita 273 animateLAB
56 Chainerで顔イラストの自動生成 - Qiita 267 Chainer
57 Chef脱落者が、Itamaeで快適インフラ生活する話 - Qiita 260 プログラミング大好きベーシック
58 組織における、エンジニアの情報共有について。あるいは、レビューや設計について。 - # TODO: タイトル決定 256 【その2】ドリコム
59 Java - さいきょうの二重サブミット対策 - Qiita 251 システムエンジニア
60 フロントエンドがサーバー負荷を抑えるためにできること - アニメイトラボ開発者ブログ 251 animateLAB
61 この百合web漫画がすごい!2016 - ゆりをよむひと 248 百合
62 音楽ゲームから「キー音」が消える日 #音ゲーマー達の発信所 - slappin' beats blog 244 #音ゲーマー達の発信所 (1枚目)
63 Scalaにおける最適なDependency Injectionの方法を考察する 〜なぜドワンゴアカウントシステムの生産性は高いのか〜 - Qiita 243 第2のドワンゴ
64 今一番JSで熱いゲームエンジン、RPGツクールMVのランタイムコードを読んでみた - Qiita 234 RPGツクールMV
65 Togetter的な社内Slackまとめサイトをつくった話 - Qiita 226 ドワンゴ
66 ES6時代のNode.js - Yahoo! JAPAN Tech Blog 225 Yahoo! JAPAN Tech
67 Fluxフレームワーク戦争の現状確認(前編) - マルシテイアは月の上 224 仮想DOM/Flux
68 囲碁とはどのようなゲームなのかについての私なりの解釈 - nekonokossの日記 224 KobeUniv
69 我が家のおうちハックの現状 - bohemia日記 223 おうちハック
70 知能と技術的特異点 - Sideswipe 221 人工知能
71 ニコニコ漫画アプリの中身、全部見せます! 〜iOSアプリ開発事例のご紹介〜 - Qiita 220 ドワンゴ
72 OSX の開発環境を Ansible で自動構築する(El Capitan / Yosemite) - Shin x Hatena Blog 219 Ansible
73 マイクロサービスのデザインパターン | Urara's Blog 215 Bluemix
74 総行数57,000の巨大CSS群をLessに書き換えた軌跡 - mixi Engineers' Blog 215 mixiグループ
75 フロントエンドで知っておきたい要素指定の考え方 - pixiv inside 215 ピクシブ株式会社
76 RubyとAWSでつくるメディアストレージ基盤 - Qiita 209 ドワンゴ
77 Swiftを使ってモダンなWeb APIクライアントを爆速で開発する - Qiita 207 iOS
78 Let's EncryptとnginxでHTTP/2サーバを立てる - pixiv inside 207 ピクシブ株式会社
79 プロダクトマネジメント - プロダクトマネージャーを2ヶ月やって思ったこと - Qiita 206 Product Manager
80 pairs開発責任者が考える「プロダクト・マネジメント」に必要な5つの資質 | eureka tech blog 204 エウレカ
81 アイホン - アイ〇ンのプロトコルの話 - Qiita 204 ねとけん
82 Ruby - Rails のアーキテクチャ設計を考える - Qiita 190 Ruby
83 Web Components と Electron でつくる Neovim フロントエンドの未来 - sorry, uninuplemented: 188 Vim
84 JavaScript で実装してみる Deep Learning - Yahoo! JAPAN Tech Blog 188 Yahoo! JAPAN Tech
85 Ruby のオススメの機能7選 - Qiita 185 Ruby
86 Rails - フロントエンド開発における革命とビルドプロセスについて - Qiita 184 freee Engineers
87 まだMVC,MVP,MVVMで消耗してるの? iOS Clean Architectureについて - Qiita 182 Money Forward
88 Go言語でファジング | SOTA 181 Go
89 RaspberryPi - IOTにIoTで対抗してみた - Qiita 179 オールアバウト
90 JavaScript - あの人気オンラインRPGをハックする - Qiita 179 ドワンゴ
91 Go最後の秘宝「GUI」を探しに行く - Qiita 176 Go その3
92 MachineLearning - わかるLSTM ~ 最近の動向と共に - Qiita 165 Machine Learning
93 Objective-Cで書かれた5年もののiOSアプリを徐々にSwiftへ置き換えている話 - Yahoo! JAPAN Tech Blog 161 Yahoo! JAPAN Tech
94 PHPで高速に動作するURLルーティングを自作してみた - pixiv inside 160 ピクシブ株式会社
95 Rails - パスワードはハッシュ化して保存していても簡単に見えちゃう問題と対策用Gemのblinkersについて - Qiita 157 freee Engineers
96 プログラマの僕が東京ではなく田舎に住む理由 #ruraladvent - give IT a try 157 地方在住ITエンジニア(元・地方在住も可)
97 GitHub おじさん スターターキット - Qiita 151 Git
98 G1 GC おさらいと #jjug_ccc で発表した話 - sugarlife's blog 150 Java
99 Webサービスを支える「Perlモジュール」20選 - ゆーすけべー日記 150 Perl 5
100 FluxのActionとStoreをちゃんと分ける話 - pixiv inside 149 ピクシブ株式会社

関連記事

sucrose.hatenablog.com

ソースコード

出力が文字化けしたりしている部分があるので手で修正したり、変なURLを取り除いたりした

# -*- coding: utf-8 -*-

import pyquery
import time
import requests

banned = set(['https://twitter.com/', 'http://nlab.itmedia.co.jp/nl/articles/1411/28/news179.html', 'http://gihyo.jp/news/info/2010/12/0102'])


def getQiitaCalendarList(year, page):
    calendar_list = pyquery.PyQuery(url='http://qiita.com/advent-calendar/{}/calendars?page={}'.format(year, page))
    calendars = set()
    for elm in calendar_list.find('.adventCalendarList_calendarTitle > a'):
        a = pyquery.PyQuery(elm)
        href = a.attr('href')
        calendars.add((href[22:], a.text()))
    return calendars

def getQiitaArticles(name):
    calendar = pyquery.PyQuery(url='http://qiita.com/advent-calendar/2015/{}'.format(name))
    article = set()
    for elm in calendar.find('.adventCalendarItem_entry > a'):
        a = pyquery.PyQuery(elm)
        url = a.attr('href')
        if url not in banned:
            article.add(url)
    return article

def getAdventarCalendarList(year):
    calendar_list = pyquery.PyQuery(url='http://www.adventar.org/calendars?year={}'.format(year))
    urls = set()
    for elm in calendar_list.find('.mod-calendarList-title > a'):
        a = pyquery.PyQuery(elm)
        href = 'http://www.adventar.org' + a.attr('href')
        urls.add((href, a.text()))
    return urls

def getAdventarArticles(url):
    calendar = pyquery.PyQuery(url=url)
    article = set()
    for elm in calendar.find('.mod-entryList-url > a'):
        a = pyquery.PyQuery(elm)
        if 'http' in a.text() and a.attr('href') not in banned:
            url = a.attr('href')
            article.add(url)
    return article

def getHatenaBookmarkCount(urls):
    assert len(urls) <= 50
    try:
        return requests.get('http://api.b.st-hatena.com/entry.counts', params={'url': urls}).json()
    except:
        time.sleep(2)
        return requests.get('http://api.b.st-hatena.com/entry.counts', params={'url': urls}).json()

if __name__ == '__main__':
    result = []
    result_article = []
    
    calendars = set()
    for i in range(1, 20):
        calendars |= getQiitaCalendarList(2015, i)
        time.sleep(1)

    for name, title in calendars:
        articles = getQiitaArticles(name)
        calendar_url = 'http://qiita.com/advent-calendar/2015/' + name
        urls = [calendar_url] + list(articles)
        hatebu_count = getHatenaBookmarkCount(urls)
        result.append((sum(hatebu_count.values()), calendar_url, title))
        result_article.extend([(url, count, calendar_url, title) for url, count in hatebu_count.items()])
        time.sleep(1)
    
    calendars = getAdventarCalendarList(2015)
    time.sleep(1)
    
    for calendar_url, title in calendars:
        articles = getAdventarArticles(calendar_url)
        urls = [calendar_url] + list(articles)
        hatebu_count = getHatenaBookmarkCount(urls)
        result.append((sum(hatebu_count.values()), calendar_url, title))
        result_article.extend([(url, count, calendar_url, title) for url, count in hatebu_count.items()])
        time.sleep(1)
    
    result.sort(reverse=True)
    print u'|*順位|*カレンダー名|*はてなブックマーク数|'.encode('utf-8')
    for i, (count, name, title) in enumerate(result[:100], 1):
        print u'|{0}|<a href="{1}">{2}</a>|{3}|'.format(i, name, title, count).encode('utf-8')
    
    result_article.sort(key=lambda x: -x[1])
    print
    print u'|*順位|*記事名|*はてなブックマーク数|*カレンダー名|'.encode('utf-8')
    for i, (url, count, calendar_url, title) in enumerate(result_article[:100], 1):
        print u'|{0}|<a href="{1}">{2}</a>|{3}|<a href="{4}">{5}</a>|'.format(i, url, pyquery.PyQuery(url=url).find('title').text().replace('|', '&#x7c;'), count, calendar_url, title).encode('utf-8')
        time.sleep(1)
-->