2015年のアドベントカレンダーが終わったので、どのカレンダーと個別の記事がはてなブックマーク件数が多かったのか調べてみた
調査方法
QiitaとAdventarに登録してあるアドベントカレンダーのURLをクロールしてはてなブックマーク件数取得APIで調べる
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('|', '|'), count, calendar_url, title).encode('utf-8') time.sleep(1)