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

В поисках вдохновения я наткнулся на немного очевидную, но хорошую статью "How to come up with side project ideas" ("Как найти идеи для личных проектов"), один из советов в ней – "Спросите своих друзей". Тут мне вспомнилось, как Катя (моя девушка), жалуясь на сложность поиска интересных фильмов для просмотра, мечтала о паблике ВКонтакте, в котором бы просто каждый день публиковались хорошие фильмы. Я тогда ответил, что это можно даже автоматизировать.

Вернувшись к этой идее, мы с Катей запустили публичную страницу "Кинопостер – случайные фильмы". Написанный мной скрипт каждый день публикует на странице три случайных фильма с высокой зрительской оценкой. Подписчики могут получать рекомендации хороших фильмов, просто читая свою ленту ВКонтакте.

В случайности выбора фильмов есть как минусы, например качество отбора фильмов для публикации хуже, так и плюсы, например – непредвзятость. Обычно алгоритмы рекомендаций выбирают объекты, похожие на то, что уже понравилось пользователю или его друзьям. Но это может привести к тому, что пользователь будет постоянно получать рекомендации в одной и той же области. Например, стоит на YouTube посмотреть какой-нибудь k-pop клип, и еще долгое время весь раздел рекомендаций будет в корейской попсе (не то что бы я был против...)


Случайные же рекомендации позволят открыть для себя что-то новое и интересное, хоть, возможно, и не сразу. Отбор фильмов по оценке должен гарантировать, что совсем плохие фильмы публиковаться не будут. Ценность этого проекта для меня в том, что он был совместным с Катей, она была идейным вдохновителем, а я занимался реализацией. Заниматься любимым делом вместе круто. Моя профессия помогла близкому человеку (ну, помимо регулярной переустановки Windows).

Самым сложным в реализации оказалась не разработка скрипта, который публикует случайные фильмы из базы данных, а, собственно, сбор этой самой базы данных. Самым популярным российским сайтом о кино является КП, обладающий полной базой фильмов с описаниями на русском языке и относительно объективными пользовательскими оценками (что проистекает из популярности и, следовательно, большого количества оценок). Это сделало его приоритетным потенциальным источником данных для нашего паблика. Печально, что КП не предоставляет API для всех разработчиков, и такие ценные данные не находятся в открытом доступе. Поэтому для создания базы данных мне пришлось заниматься скрапингом (парсингом) страниц сайта. Я решил заполнить БД один раз, чтобы публиковать описания фильмов из нее, а не парсить страницу фильма для каждой публикации, иначе изменения на сайте могли нарушить работу моих скриптов.

Сбор данных производился в два этапа. Сначала я собрал список идентификаторов нужных мне фильмов. Сайт КП+, на котором находится бета-версия мертворожденного редизайна, использует для поиска фильмов JSON API, что позволило избежать разбора HTML на первом этапе. Я установил на странице поиска следующие параметры: оценка выше 6, года выпуска 1970-2016, из списка жанров исключил анимацию, документалки и короткометражки. Потом подсмотрел в инструментах разработчика Google Chrome сформированный запрос к серверу и перенес его в свой скрипт.


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

Полная информация о фильмах в JSON API КП+ не попадает, поэтому я взял список идентификаторов и отправился на основной сайт КП, где вся информация о фильме удобно выводится на одной странице. Другим скриптом с использованием Java-библиотеки Jsoup для разбора HTML на CSS-селекторах для каждого фильма была сформирована запись в базе данных со следующими полями: русское/оригинальное название, год, страна, жанр, описание, оценка, режиссер, актеры, ссылки на постер, трейлер и кадры из фильма. Это те данные, которые нужны для публикации описания фильма в паблике.


С этой базой данных на руках, я написал приложение на Котлине, которое выбирает несколько случайных фильмов и публикует их на странице ВКонтакте. Посоветовавшись с Катей, я ввел дополнительное ограничение, чтобы публиковались фильмы только с оценкой выше 7. Взаимодействие с базой данных Postgres производится через старое доброе JDBC, случайные фильмы выбираются запросом select * from movies order by random() limit $count;, где movies – таблица БД с фильмами, а $count – нужное количество фильмов. Я создал задачу в Планировщике Windows, чтобы приложение раз в 3 дня публиковало в паблике 9 отложенных записей. Работа с API ВКонтакте производится с использованием официальной Java-библиотеки vk-java-sdk. В процессе ее использования я наткнулся на баг, и сделал пулл-реквест с его исправлением, так что я теперь контрибутор в opensource-проект, а мой код есть в кодовой базе ВКонтакте. Исходный код приложения kinoposter размещен на Github.

Сейчас Кинопостер – мой любимый личный проект. В отличие от нескольких других, он успешно реализован, и полезен как минимум двум людям. Если вам тоже понравилась идея, предлагаю подписаться.

Поиск