唯物是真 @Scaled_Wurm

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

はてなブックマーク数が多い2016年のアドベントカレンダーの記事(途中経過)

去年書いたスクリプト↓がだいたいそのまま動いたのでアドベントカレンダーのはてなブックマークの合計数のランキングと記事別のランキングを今年も出してみた
sucrose.hatenablog.com
全件記事を見たわけではないので変なゴミが混じっているかも

今年はディープラーニングの記事がたくさんはてブを集めていて人気を感じる

↓最終結果も出した

カレンダーの合計ランキング

順位 カレンダー名 はてなブックマーク数
1 システムエンジニア 3070
2 DeepLearning 1593
3 LITALICO Engineers 1535
4 N高 1504
5 Shell Script 1433
6 Fujitsu 1398
7 転職(その2) 1354
8 トレタ 1222
9 UI Design 1217
10 Linux 1193
11 Ruby on Rails 1191
12 Recruit Engineers 1066
13 React 1047
14 ピクシブ株式会社 955
15 フリーランス残酷物語 933
16 おうちハック 929
17 freee Engineers 888
18 Product Manager 838
19 クラウドワークス 829
20 筋肉 824
21 家庭を支える技術 784
22 Supership株式会社 782
23 KMC 781
24 Goodpatch 726
25 Yahoo! JAPAN Tech 667
26 Pepabo Managers 607
27 素数大富豪 596
28 Go (その3) 568
29 eureka 555
30 カノジョできないエンジニア 493
31 技術翻訳 486
32 GetWild 481
33 ドワンゴ 478
34 Electron 466
35 Tech-Circle Hands on 462
36 SHIROBAKO 455
37 FLASHer 440
38 Go (その2) 433
39 pyspa 431
40 pepabo 427
41 Go 406
42 feedforce 396
43 Fablic 384
44 Vim (その2) 380
45 KAYAC 358
46 健康 353
47 ベーシック 350
48 C++ 349
49 なんでもセキュリティ 342
50 Vim 324
51 Serverless 324
52 Akerun 321
53 CSS 311
54 ソフトウェアテスト 304
55 機械学習に必要な高校数学やり直しアドベントカレンダー 289
56 転職 289
57 MySQL Casual 288
58 気に入ったインタビュー 280
59 イノベーター・ジャパン 275
60 Speee 263
61 Docker 260
62 Mackerel 253
63 ポエム 252
64 自宅サーバの思い出 251
65 PHP 237
66 Slack 236
67 http2 234
68 CyberAgent Developers 233
69 脆弱性"&'<<>\ 233
70 ドリコム 231
71 Ruby 229
72 Python 206
73 クローラー/Webスクレイピング 190
74 Chainer 190
75 Ambient for Christmas 185
76 フロントエンドエンジニア 183
77 Haskell 170
78 つくりおき 166
79 Vim 8.0 163
80 Nextremer 160
81 Board Game Design 158
82 TensorFlow 158
83 カノジョできてるエンジニア 152
84 Angular 151
85 jupyter notebook 150
86 クソアプリ 149
87 コミュニケーション 149
88 KLab 145
89 Ex CyberAgent Developers 142
90 さくらインターネット 142
91 スタートトゥデイ工務店 139
92 Livesense 138
93 絵文字 / Emoji 136
94 Google Cloud Platform(2) 135
95 mruby 133
96 Google Cloud Platform(1) 133
97 Python 130
98 R 126
99 CTF 125
100 mixiグループ 118

記事別ランキング

アドベントカレンダー一覧ページも含む

順位 記事名 はてなブックマーク数 カレンダー名
1 質問は恥ではないし役に立つ - Qiita 2119 システムエンジニア
2 高校生にWeb上でプログラミングを教え始めたエンジニアがこの8ヶ月間で得た気づき - Qiita 1498 N高
3 プログラマーの君! 騙されるな! シェルスクリプトはそう書いちゃ駄目だ!! という話 - Qiita 1233 Shell Script
4 数千ページのワイヤーフレームを書いてきたWebディレクターがUI設計時に気を付けている8つのこと。 - 笑顔を創りたいWeb屋の日常 1116 UI Design
5 プログラミング勉強を加速させる7つの習慣 - Qiita 1004 LITALICO Engineers
6 【定番】 新しいWebサービスを開発・運営するときに使いたいサービス 【2016年末版】 - Qiita 828 トレタ
7 転職する時に必ずチェックしたい募集要項 - Qiita 803 転職(その2)
8 子どもがいる家庭で使うRaspberryPi&Slack | もやし工房 子どもがいる家庭で使うRaspberryPi&Slack – もやし工房 751 家庭を支える技術
9 電気工事士の資格を取ってコンセントやスイッチを改造しようぜ - Qiita 737 おうちハック
10 筋トレを継続する技術 - Qiita 709 筋肉
11 2016年、サーバーサイドエンジニアがゼロからReact/Reduxを学習したときの方法を振り返る | BLOG | 株式会社スタジオ・アルカナ 685 React
12 俺が悪かった。素直に間違いを認めるから、もうサービスクラスとか作るのは止めてくれ - Qiita 661 Ruby on Rails
13 DeepLearning研究 2016年のまとめ - Qiita 657 DeepLearning
14 ディープラーニングで「インド人を右に」を理解する: Generative Adversarial Network による画像モーフィング 657 DeepLearning
15 ビビりなエンジニアが大企業を辞めて起業した話 - 最速配信研究会(@yamaz) 637 Supership株式会社
16 チームの良さを確認するためにやったこと - Web錯誤 625 Product Manager
17 次世代監視の大本命! Prometheus を実運用してみた - Qiita 566 freee Engineers
18 「パッと見素数」に気をつけろ! - アジマティクス 550 素数大富豪
19 イケイケなベンチャーの開発チームが、大企業的な開発チームになってしまう5つの兆候 - Qiita 546 クラウドワークス
20 富士通がAdvent Calendarに参加することになった理由 - blog 543 Fujitsu
21 ゼネコンを九ヶ月で辞めた話 - (。・ω・。)ノ・☆':*;':* 527 KMC
22 Linuxネットワークドライバの開発 - Handwriting 514 Linux
23 「関数型プログラミングって何?」日本語訳 - Okapies' Archive 475 技術翻訳
24 フリーランスになって、嫌な思い出 - Qiita 471 フリーランス残酷物語
25 Linux スケジューラーのコア実装とシステムコール - Qiita 457 Linux
26 リクルートテクノロジーズのフロントエンド開発 2016 - from scratch 433 Recruit Engineers
27 単純作業を自動化して人類の無駄な時間をなくそう - 竹迫の近況報告 402 Recruit Engineers
28 ドワンゴの呪い - @nalgami 397 転職(その2)
29 大きな組織で情報共有するためのOSSつくってみた - Qiita 363 Fujitsu
30 SIの現場のiOSアプリケーション開発 - Qiita 360 システムエンジニア
31 キャリアが気になる、35歳以降が気になるエンジニアのみなさんに43歳現役エンジニアからたったひとつのアドバイス - かっぱラクガキ帳 349 健康
32 カノジョできないエンジニア Advent Calendar 2016 - Qiita 343 カノジョできないエンジニア
33 コンパイル中にコンパイルする「コンパイル時Cコンパイラ」をつくった話 - kw-udonの日記 340 C++
34 テスト計画の立て方 - Qiita 333 システムエンジニア
35 フリーランスアニメーター 瀬川美里 - Konifar's WIP 332 SHIROBAKO
36 2016年のディープラーニング論文100選 - Qiita 328 Fujitsu
37 コードレビューするのが怖いと思っていたエンジニアが半年間コードレビューを経験して思った 10 のこと - ポンコツWebエンジニアのかっこ悪く生きる日記 308 pepabo
38 GitLabの運用方法をドーンと公開!! - pixiv inside 306 ピクシブ株式会社
39 (短いビット長の)RSA暗号を解いてみる - clock-up-blog 304 なんでもセキュリティ
40 Chrome拡張の権限でどこまで(悪いことを)できるのか?とその対策【デモあり】 - Qiita 295 Tech-Circle Hands on
41 Flashが教えてくれたこと、HTML5で失ったもの。(仮 - Qiita 290 FLASHer
42 React のソースコードを読んでみよう! - マルシテイア 282 React
43 Ruby on Railsで作ったWebサービスを5倍速くしてメモリを半分以下にした話 - Qiita 265 ベーシック
44 Electron アプリをつくる時に便利なパッケージ - はやくプログラムになりたい 236 Electron
45 割れ窓理論を導入してWebサービスのクオリティに直結した話 - pixiv inside 224 ピクシブ株式会社
46 Go 言語 Webフレームワークはこれを使おう 2016年12月版 - Witch on the Other Shore 218 Go (その2)
47 今年のうちに知っておきたい!ES2017に入る5つの新仕様 - エンジニアをリングする 215 Goodpatch
48 GetWild Advent Calendar 2016 - Qiita 209 GetWild
49 HTTP の新しいステータスコード 103 Early Hints | blog.jxck.io 207 http2
50 マイクロサービス時代に捧ぐ、Railsでの中規模APIサーバ開発のための技術構成 - Qiita 187 Ruby on Rails
51 エンジニア個人が自主的に成長するように促す - エンジニア組織の自律的成長 - 人間とウェブの未来 181 Pepabo Managers
52 女子高生だったときに気が狂ってWin98でサーバーをたてた話 - Catch me If you can 178 自宅サーバの思い出
53 PICTでテストケースの組み合わせ爆発にさよならを - エンジニアをリングする 173 Goodpatch
54 フリーランス残酷物語 Advent Calendar 2016 - Qiita 168 フリーランス残酷物語
55 機械学習で美少女化 ~ あるいはNEW GAME! の世界 ~ - Qiita 166 ドワンゴ
56 ヤフーの社内システムを紹介します - Yahoo! JAPAN Tech Blog 166 Yahoo! JAPAN Tech
57 d . █████に入社してました 165 pyspa
58 クリック・タッチを無効化するCSS「pointer-events: none;」がお手軽で便利 - Yahoo! JAPAN Tech Blog 162 Yahoo! JAPAN Tech
59 静的解析ツール「RubyCritic」のUIが良くなっていたので紹介したいです! - パラボラアンテナと星の日記 162 feedforce
60 「ボトムアップの見かけはとても重要」 - ninjinkun's diary 160 Product Manager
61 よくないねボタン - Qiita 156 ポエム
62 プログラマーも手動テストしようぜ 〜 忍者式テストのすすめ 〜 - Qiita 154 ソフトウェアテスト
63 オインクゲームズのコンポーネントデザイン - Studio | Oink Games 147 Board Game Design
64 Webpack の本質とそれがよく分かるチュートリアル - 彼女からは、おいちゃんと呼ばれています 146 フロントエンドエンジニア
65 Deep Learningによる一般物体検出アルゴリズムの紹介 - ABEJA Tech Blog 140 DeepLearning
66 安全な脆弱性の作り方 - 葉っぱ日記 138 脆弱性"&'<<>\
67 サイバーエージェントを退職しました | κeenのHappy Hacκing Blog 138 Ex CyberAgent Developers
68 どのようにしてマネージャーとしてのスキルを得てきたか - Qiita 134 Pepabo Managers
69 ウェブページをできる限りネイティブアプリっぽく魅せるテクニックまとめ 〜アップルにリジェクトされつづけるなら、ウェブアプリとストアをつくって自前で配信してしまおうという企み〜 - KAYAC engineers' blog 133 KAYAC
70 リーダーであるための視野・視座・視点 - Tech Inside Drecom 133 ドリコム
71 E2Eテスト基盤開発を担当して - Qiita 130 freee Engineers
72 意外と知らないgoroutineのスケジューラーの挙動 #golang - Qiita 129 Go (その3)
73 Dockerコンテナを本番環境で使うためのセキュリティ設定 - Qiita 128 スタートトゥデイ工務店
74 サービスクラスについては僕も悪かったと思っているけど、それでもCQSは実現したいんだ - Qiita 128 Ruby on Rails
75 Rubyやってます、(`・ω・´)キリッ という為に押さえときたいテクニック - Qiita 127 Ruby
76 ソーシャルゲーム業界から去る事にしたこと。5度の転職で得られた経験とその結果。 - teitei's blog 123 転職
77 運用フェーズにおけるGCPとAWSの違いについて - Qiita 121 Google Cloud Platform(2)
78 プログラマ35歳定年説は覆せる | 米マイクロソフトの開発者となった河野通宗の働き方 | CAREER HACK 120 気に入ったインタビュー
79 SQLを繰り返し実行したら段階的に応答速度が上がった話 - なからなLife 118 MySQL Casual
80 Go でロックする - Qiita 117 Go (その3)
81 機械学習でなんとなく材料研究者の気分を味わおう - Qiita 115 Nextremer
82 機械学習に必要な高校数学やり直しアドベントカレンダー Advent Calendar 2016 - Qiita 114 機械学習に必要な高校数学やり直しアドベントカレンダー
83 【クソアプリで身につけるiOSアプリ開発】 10日で21個アプリを作った話 - ロボット・IT雑食日記 112 クソアプリ
84 Yahoo! JAPAN のサーバー OS について - Yahoo! JAPAN Tech Blog 112 Yahoo! JAPAN Tech
85 絶対に笑ってはいけないRailsコード集 - Qiita 111 LITALICO Engineers
86 MySQLのトランザクション制御がキモい話 - なからなLife 110 MySQL Casual
87 Amazon Dash Buttonでスマートロックを開けられるようにしたら思ったよりも便利だった / Akeurn Advent Calendar 10日目 - フォトシンス エンジニアブログ 109 Akerun
88 自称JavaScript中級者が知らなさそうな、10個の仕様 - Qiita 108 Goodpatch
89 突撃!隣のキーボード - KAYAC engineers' blog 107 KAYAC
90 GitHub用のIssue Reader「Jasper」の開発を振り返ってみる - maru source 106 Electron
91 安定なオフィス無線LAN運用のススメ - Qiita 106 LITALICO Engineers
92 QiitaのCSS構成2016 - Qiita 106 CSS
93 少人数のチームなので全員同じKPI担当にしたらサービスも組織も成長した話 | yusukehiruta.com 104 Pepabo Managers
94 Slackで多人数オンラインアクションゲームを作る方法 - Qiita 103 ドワンゴ
95 Girl Friend Factory - 機械学習で彼女を創る - - Qiita 101 ドワンゴ
96 今年のうちに対応したい、Node.jsのBufferに潜む危険性 - Yahoo! JAPAN Tech Blog 101 Yahoo! JAPAN Tech
97 Docker と Kubernetes を使って『変化に強いインフラ』を作る by 坂部 広大 | Wantedly Engineer Blog 101 Tech-Circle Hands on
98 健康に気を遣う歳になってしまったので筋トレを始めた - YAMAGUCHI::weblog 101 pyspa
99 AWSの保守運用を自動化するためのアーキテクチャ - Qiita 99 システムエンジニア
100 Houdini、それはCSSの進化を促すプロジェクト - The future starts today 99 CSS

ソースコード

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

import pyquery
import time
import requests

banned = set(['http://www.4gamer.net/games/074/G007497/20120713064/', 'http://horiemon.com/talk/11346/'])


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/2016/{}'.format(name))
    article = set()
    for elm in calendar.find('.adventCalendarItem_entry > a'):
        a = pyquery.PyQuery(elm)
        url = a.attr('href')
        if 'http' in url and 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, 27):
        calendars |= getQiitaCalendarList(2016, i)
        time.sleep(1)

    for name, title in calendars:
        articles = getQiitaArticles(name)
        calendar_url = 'http://qiita.com/advent-calendar/2016/' + 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(2016)
    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)