Quantifying Hacker News with 50 days of data
Андрей Карпаты анализирует активность на Hacker News, используя данные, собранные скриптом, который каждую минуту скачивал главную страницу и страницу новых историй. За период с 22 августа по 30 октября удалось собрать 47 дней данных (с несколькими пропусками из-за простоев машины), причём один день занимает около 10 МБ в виде сжатых gzip-pickle файлов. Сырой HTML парсится с помощью BeautifulSoup в структурированный JSON — каждую минуту получается по 60 записей (30 с главной страницы и 30 со страницы новых). Цель анализа — визуализировать, как истории набирают голоса в течение дня, выяснить самые популярные домены, пользователей и темы, а также лучшее время для публикации. Подробный анализ представлен в виде IPython Notebook, а код для сбора данных автор изначально выкладывал, но позже убрал датасет, чтобы сэкономить место на хостинге.
Измеряем Hacker News в цифрах
Я подумал, что было бы интересно проанализировать активность на одном из моих любимых источников интересных ссылок и информации — Hacker News. Источник данных — скрипт, который я настроил где-то в августе и который каждую минуту скачивает HN (главную страницу и страницу новых историй). Нам будет интересно визуализировать, как истории набирают голоса в течение дня, выяснить, какие домены/пользователи наиболее популярны, какие темы наиболее популярны и какое время лучше всего для публикации истории. Я выкладываю все свои данные и код (скрипты сбора данных на Python + IPython Notebook для анализа) на случай, если вы захотите провести аналогичный анализ.
Я настроил очень простой python-скрипт, который каждую минуту собирает с HN главную страницу и страницу новых историй. Один день данных начинается в 4 утра (PST) и заканчивается в 4 утра следующего дня. Файлы .html сохраняются в сжатом виде как gzip-pickle, и один день занимает примерно 10 МБ в этом формате. Мне пришлось несколько раз выключать машину на пару дней, так что в данных есть пробелы, но в итоге мы получаем 47 дней данных за период с 22 августа по 30 октября.
Парсинг сырых HTML-данных
Скрипт парсинга на Python использует BeautifulSoup для преобразования сырого HTML в более структурированный JSON. Кстати, написать этот скрипт было совсем не просто — HN построен на неструктурированных таблицах, и мне пришлось по ходу дела обнаружить множество странных пограничных случаев в его поведении. В итоге у меня получилась 100-строчная самая-уродливая-функция-парсинга-на-свете (правда, я ею не горжусь), но она работает и выдаёт примерно следующее для одной истории в конкретный момент времени:
{ 'domain': u'play.google.com', 'title': u'Nexus 5', 'url': u'https://play.google.com/store/devices/details?id=nexus_5_black_16gb', 'num_comments': 42, 'rank': 1, 'points': 65, 'user': u'sonier', 'minutes_ago': 39, 'id': u'6648519' }
Мы получаем по 60 таких записей каждую минуту (30 с главной страницы и 30 со страницы новых) и снова сохраняем их все на диск. Теперь мы готовы достать IPython Notebook и перейти к самому вкусному — анализу!
Анализ: подробный разбор
Переходите к IPython Notebook, отрендеренному в виде HTML, чтобы посмотреть анализ:
Примечание: у меня был доступен для скачивания весь датасет и исходник .ipynb IPython Notebook, но недавно я убрал его, чтобы сэкономить место на хостинге (извините).