История о том, как я посты Pikabu анализировал

Disclaimer: я не являюсь экспертом в этой области, смело усмехайтесь и кидайте тапки! :3

Привет, обычно я занимаюсь тем, что сижу на работе и фигачу сайты, но иногда у меня появляется несколько свободных дней, которые можно потратить на что-нибудь более интересное, а главное, веселое.

В один из таких свободных летних вечеров, сидя с градусником в одной руке и кружкой чая с малиной в другой, листая ленту pikabu третьей, я подумал: а почему бы не спарсить пару сотен постов и не посмотреть на них со стороны цифр?

Парсер

Итак, что мы имеем: пикабу (1 штука), посты на пикабу за промежуток с 06.07.16 по 12.07.16 включительно, чай (количество неизвестно), треки с Monstercat (чтобы лучше работалось). Само собой, вручную заносить огромное количество постов в экселевскую таблицу мы не будем, но пикабу не позволяет нам просто взять и получить все интересующие нас данные.

Немного поговорив с администратором по почте, понимаем, что открытого API у пикабу нет и в обозримом будущем не предвидится. Чтож, придется писать парсер. Парсеры я писать люблю, и это не лечится.

Окинув взглядом исходник страницы, понимаем две вещи: первая — страницы весьма просты для парсинга, вторая — страницы просто огромные, так что парсится оно будет долго. Где-то в этот момент я отказался от того, чтобы спарсить посты за месяц, ограничившись неделей.

Определившись со списком интересующих нас данных (точнее, всех, что мы можем собрать из страницы поста), получаем следующий список:

ID, Заголовок, Логин автора, Сообщество, Дата добавления, Тип поста, Рейтинг поста, Удален ли пост, Длиннопост ли пост, Есть ли отметка “моё”, Помечен ли пост клубничкой, Количество комментариев, Список тегов, Значения счетчиков соцсетей

Для парсинга я использовал любимую связку из Ruby + Nokogiri и весь парсер занял у меня около 100 строк кода, исходники вот тут:

Пропарившись пару часов с кодом, и, наконец-то запустив парсер, понимаем, что несмотря на мой 100-мегабитный интернет, даже данные за неделю будут собираться уж очень долго. Раскошеливаемся на , запускаем наш парсер там — бинго!

Когда смотришь на то, как машина за тебя делает какую-то работу и радостно сообщает об этом огромным потоком сообщений в консоль, хочется только откинуться на спинку табуретки и включить какую-нибудь подходящую музыку :) F.O.O.L, кстати, весьма неплохо подходит.

Бедный маленький сервер. Антиддос пикабу такому напору не порадовался и немного послал меня

В сумме, спарсить все интересующие меня посты заняло около 6 часов.

Обработка

Теперь у нас есть набор машиночитаемых json-ов, и чего с ними дальше делать? А давайте загрузим в MongoDB.

Заменяем все id на _id, чтобы монго не придумывало свои айдишники и через mongoimport загоняем в базу:

for f in *.json; do mongoimport -d Pikabu -c Posts --jsonArray --file=$f; done

Последняя проблема на пути к мировому господству: превратить наши даты добавления постов из цифрового формата в монговский isodate, решается это так (обратите внимание, там есть умножение на 1000, оно нужно потому что в javascript дата хранится в миллисекундах, а у нас она в секундах):

db.Posts.find().forEach(function(doc){db.Posts.update({_id : doc._id}, {$set : {_date : new Date(doc.date*1000)}});});

Оглядываемся, понимаем, что время было бы неплохо подвинуть на 4 часа назад для простоты анализа, так как база отображает его в моем локальном часовом поясе, а парсил я с огрядкой на Москву. Не беда:

db.Posts.find().forEach(function(doc){db.Posts.update({_id : doc._id}, {$set : {_date : new Date((doc.date - 14400)*1000 )}});});

В базу данные внесли, теперь можно и начать интересные вещи оттуда извлекать! :)

Веселимся!

Для начала посмотрим, сколько всего постов было добавлено за это время:

Теперь попробуем разузнать что-нибудь более интересное. Узнаем, какой автор получил наибольшее число рейтинга за посты и другие интересные вещи. Дальше без подписей, просто куча картинок.

С отрывом почти в 30000 рейтинга

Полный список используемых инструментов:

Ruby, Nokogiri, MongoDB, Mongo Compass, MongoChef, QueryMongo, mongoimport

Связь:

Любые идеи и деловые предложения принимаются по адресу .

Помочь денюжкой всегда можно тут:

Буду очень признателен, если вы нажмете на зелененькое сердечко в левом углу :)

Immolate Improved