QiitaとAdventarにあるアドベントカレンダーについて、個別の記事とカレンダー全体のはてなブックマーク数のランキングを29日の21時ごろに集計した
個別記事上位100件のURLについては軽く目で見て文字化けを直したり最近の記事ではないURLをフィルタリングしてある(スクリプトのバグや作業ミスで抜けてる場合があったらご容赦ください。バグを直していただけるととても嬉しいです)
カレンダーごとの合計数のランキング
カレンダーとカレンダーに登録されている記事のはてなブックマークの合計数
記事ごとのランキング
去年の記事
調べるのに使ったソースコード
雑実装なのでページがutf-8以外だと文字化けしたりします
# -*- coding: utf-8 -*- import pyquery import time import requests import json banned = set(['https://twitter.com/', 'https://www.google.co.jp', 'https://twitter.com']) 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/2017/{}'.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() data = calendar.find('div[data-react-class]').attr('data-react-props') for entry in json.loads(data)['entries']: url = entry['url'] if url is not None and 'http' in url and url not in banned: 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, 31): calendars |= getQiitaCalendarList(2017, i) time.sleep(1) for name, title in calendars: articles = getQiitaArticles(name) calendar_url = 'http://qiita.com/advent-calendar/2017/' + 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(2017) 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[:120], 1): try: 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') except: print u'|{0}|<a href="{1}">{2}</a>|{3}|<a href="{4}">{5}</a>|'.format(i, url, url, count, calendar_url, title).encode('utf-8') time.sleep(1)