newsmode
search
Меню
arrow_back Назад

Quantifying Hacker News with 50 days of data

auto_awesomeКраткое саммари

Андрей Карпаты анализирует активность на Hacker News, используя данные, собранные скриптом, который каждую минуту скачивал главную страницу и страницу новых историй. За период с 22 августа по 30 октября удалось собрать 47 дней данных (с несколькими пропусками из-за простоев машины), причём один день занимает около 10 МБ в виде сжатых gzip-pickle файлов. Сырой HTML парсится с помощью BeautifulSoup в структурированный JSON — каждую минуту получается по 60 записей (30 с главной страницы и 30 со страницы новых). Цель анализа — визуализировать, как истории набирают голоса в течение дня, выяснить самые популярные домены, пользователей и темы, а также лучшее время для публикации. Подробный анализ представлен в виде IPython Notebook, а код для сбора данных автор изначально выкладывал, но позже убрал датасет, чтобы сэкономить место на хостинге.

Quantifying Hacker News

Измеряем Hacker News в цифрах

I thought it would be fun to analyze the activity on one of my favorite sources of interesting links and information, Hacker News. My source of data is a script I’ve set up some time in August that downloads HN (the Front page and the New stories page) every minute. We will be interested in visualizing the stories as they get upvoted during the day, figuring out which domains/users are most popular, what topics are most popular, and the best time to post a story. I’m making all my data and code (Python data collection scripts + IPython Notebook for analysis) available in case you’d like to carry out a similar analysis.

Я подумал, что было бы интересно проанализировать активность на одном из моих любимых источников интересных ссылок и информации — Hacker News. Источник данных — скрипт, который я настроил где-то в августе и который каждую минуту скачивает HN (главную страницу и страницу новых историй). Нам будет интересно визуализировать, как истории набирают голоса в течение дня, выяснить, какие домены/пользователи наиболее популярны, какие темы наиболее популярны и какое время лучше всего для публикации истории. Я выкладываю все свои данные и код (скрипты сбора данных на Python + IPython Notebook для анализа) на случай, если вы захотите провести аналогичный анализ.

I set up a very simple python script that scrapes the HN front page and the new stories page every minute. A single day of data begins at 4am (PST) and ends at 4am the next day. The .html files are saved compressed as gzipped pickles and one day occupies roughly 10mb in this format. I had bring down my machine for a few days a few times so there are some gaps in the data, but in the end we get 47 days of data from period between August 22 and October 30.

Я настроил очень простой python-скрипт, который каждую минуту собирает с HN главную страницу и страницу новых историй. Один день данных начинается в 4 утра (PST) и заканчивается в 4 утра следующего дня. Файлы .html сохраняются в сжатом виде как gzip-pickle, и один день занимает примерно 10 МБ в этом формате. Мне пришлось несколько раз выключать машину на пару дней, так что в данных есть пробелы, но в итоге мы получаем 47 дней данных за период с 22 августа по 30 октября.

Raw HTML data parsing

Парсинг сырых HTML-данных

The parsing Python script uses BeautifulSoup to convert the raw HTML into a more structured JSON. This script was by the way by no means simple to write – HN is based on unstructured tables and I had to discover many strange edge cases in its behavior along the way. At the end I ended up with a 100-line ugliest-parsing-function-ever (really, I’m not proud of it) but it works and outputs something like the following for a single story at a specific snapshot:

Скрипт парсинга на 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' }

{ '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' }

We get 60 such entries every minute (30 for front page and 30 for new page) and these are again all saved to disk. We are now ready to bring out the IPython Notebook and get to the juicy analysis!

Мы получаем по 60 таких записей каждую минуту (30 с главной страницы и 30 со страницы новых) и снова сохраняем их все на диск. Теперь мы готовы достать IPython Notebook и перейти к самому вкусному — анализу!

The Analysis: Detailed analysis

Анализ: подробный разбор

Head over to the IPython Notebook rendered as HTML for the analysis:

Переходите к IPython Notebook, отрендеренному в виде HTML, чтобы посмотреть анализ:

Note: I had the entire dataset and .ipynb Ipython Notebook source available for download but recently took it down to save space on my host (sorry).

Примечание: у меня был доступен для скачивания весь датасет и исходник .ipynb IPython Notebook, но недавно я убрал его, чтобы сэкономить место на хостинге (извините).