Всем привет, меня зовут Владислав, я Java‑разработчик. В двух словах — навайбкодил мини‑приложение, которое переносит оценки с кинопоиска (далее КП) на imdb. Дальше речь пойдет именно про это.
Знакомство с КП
Ещё в школьные годы я начал смотреть фильмы с осознанным подходом. Смотреть то, что шло по ТВ стало менее интересно. Выбор фильма упирался в выбор телеканала, из тех, которые были подключены, рекламы, конкретное время показа. Все это доставляет неудобства. Решение очевидно — выбрать фильм и посмотреть его на какой‑то платформе. Но как выбрать фильм? Тут и пришел на помощь КП. Оценки, рецензии, трейлеры, куча информации о фильме, актерах, режиссерах и всего того, что было нужно и не нужно.
Но что не так с КП?
В октябре 2013 года яндекс выкупил КП. Для меня на тот момент это ничего не значило, ведь сервис остался прежним и продолжал работать.
И перезапуск 2015 года не сильно повлиял на мое мнение, ведь все вернули обратно. Но всё‑таки они реализовали свою идею в 2018 году и добавили онлайн просмотр.
Следующая неприятность случилась в 2019 году, когда авторизацию сделали только через яндекс. Именно тогда мне и пришлось зарегистрироваться в этой экосистеме.
А в 2020 году изменили систему оценок. Все это, несомненно, не доставляло положительных эмоций. Но то, что происходит в последние годы, совершенно другая история.
Сейчас первые 3/5 части главной страницы занимает реклама в том или ином виде. Реклама стримингов, реклама яндекса, реклама фильмов, которые мне не интересны. Я захожу туда, чтобы поставить оценку просмотренному фильму, поискать что посмотреть, или прочитать статью и новости из мира кино. И весь этот функционал остался. Но качество статей заметно упало. Появилось продвижение «наших» фильмов. Информация о фильмах появляется с задержками и так далее
К примеру так


Стало нельзя посмотреть дату оценки фильма друга и много чего ещё. Ведь, как все мы знаем

Что дальше?
И я задумался о переходе на imdb. Переносить ~1300 оценок (на момент идеи) руками достаточно трудоёмкое занятие, которого я хотел избежать. Первое, что я сделал — загуглил, есть ли такой сервис. Увы, такого не оказалось. А те, которые всплывали, уже давно устарели и не работают. Второй вариант — написать такой скрипт самому. Но изучать какой‑то новый фреймворк или язык исключительно для этого не очень хотелось. Быстрее было бы уже перенести руками. Я погуглил ещё и наткнулся на imdb api, которое облегчило бы мне задачу. Изучив информацию, решил им написать. Описал вкратце ситуацию и что мне пригодился бы эндпоинт для проставления оценок. И я получил от них ответ.

Скажем прямо, ценник меня не сильно обрадовал и эту идею я забросил. Я продолжил пользоваться КП. К слову, у КП нет открытого api. Все это время сервис не становился лучше. Совсем.
Знакомство с ИИ
Вообще, всю эту тему с ИИ я не воспринимал серьёзно и больше ощущал как игрушку для развлечения. Но постепенно отношение к нему начало меняться, наверное, параллельно с его развитием. Сначала я начал пользоваться ИИ ответами гугла, затем и сам начал ему задавать вопросы. В апреле этого года мой друг (не айтишник) хвастался тем, что поставил себе gemini на телефон и практически боготворил его. Вскоре я его скачал и тоже начал пользоваться. А летом этого года, на каком‑то из созвонов с ТЛ, он показал своего агента, как он его использует и для чего. Я заинтересовался и поставил себе. Посмотрев несколько обучающих видео на корпоративном портале про агента, настроил его, конфиги, субагентов, температуру, промты, mcp, плагины и так далее. В общем, комфортное окружение, которое продолжаю улучшать по мере необходимости. Слегка освоившись с технологией, вспомнил про свою боль с КП.
Проект
Мини‑заготовка проекта уже имелась, но она была настолько сырая, что даже и не понятно было что это и для чего. И я решил попробовать агента, чтобы допилить свою задумку. Можно было бы написать оптимальный скрипт, например на python, но, когда в руках молоток — все проблемы гвозди. Поэтому я продолжил писать на java. На самом деле этот выбор был обусловлен следующим:
Это то, что я знаю, и могу легко прочитать и исправить самостоятельно.
На java тоже можно реализовать эту задумку.
Попробовать в принципе агента на «боевой» задаче.
Процесс строился достаточно незамысловатым образом. Я говорю, чего ожидаю от приложения, он пишет. Правки, доработка разных кейсов и все по кругу. Сейчас бы этот процесс я выстроил иначе, но в начале пути бил в лоб.
Смолл ток про ошибки



Итого: имеем spring boot, Selenium, jsoup, JavaFX.
Разработка
Изначально задумывалось, что приложение будет парсить html страницы, брать оценку и проставлять её на imdb. Но в процессе разработки наткнулся на неофициальную апи кинопоиска. У них есть достаточно разных эндпоинтов, в том числе и единственный нужный мне — получение оценок пользователя. Единственная загвоздка была в том, что этот эндпоинт возвращает ~1500 последних оценок пользователя. В моем случае это было идеально. Но, например, у моего друга 4к+ оценок и этот лимит был очень некстати. Я написал им на почту, рассказал про свою задумку, и ребята любезно повысили лимит, за что им отдельное спасибо.
Приложение парсит оценки с КП, сохраняет дамп, проставляет оценки на imdb.
Сперва парсинг и проставления были единым процессом. Проставление на imdb всегда было и есть через браузер, фреймворк selenium. А вариантов парсинга было несколько:
селениум (чистый парсинг через браузер)
апи (только через api kinopoiskapiunofficial)
hybrid (первые 1500 через апи, остальное через селениум)
дамп (если он остался с прошлого парсинга)
Вначале на парсинг и проставление на фильм уходило много времени. Очень много. Порядка 15–20 секунд. Это было связано с тем, что у обоих сервисов анти‑бот, и агент посоветовал делать задержки между фильмами.

Проведя простые подсчёты выходим на 180–240 фильмов в час. Даже для моих оценок это очень долго. Потом процесс парсинга и проставления оценок разделился на 2 независимых по нескольким причинам. Основные — это долгий процесс, не всегда есть возможность оставить ПК. В случае возникновения ошибок, пропуска фильмов и так далее приходилось начинать все заново. Также таймауты были заметно уменьшены, а на КП убраны вовсе.
Вдобавок был повышен лимит для апи. По итогу для парсинга осталось 2 способа — селениум и апи.
Парсинг
Апи
Плюсы:
работает в разы быстрее
отдает imdbId

Минусы:
вам нужно будет зарегистрироваться на сайте и получить токен. Хоть это и бесплатно, но отнимает время. Он нужен в самом приложении.
отдает imdbId не всех фильмов, и не всегда корректный, но по большей части верный. По личным наблюдениям без какой‑либо статистики, процентов 80–85 всё ок.
парсит не все фильмы. Проверял на профиле друга, у которого 4151 оценка. Апи вернуло 4094, то есть потеря оказалась 1.37%, что в данном случае очень хороший результат. В моем же случае — 1496 из 1530. Потеря 2.22%
Селениум
Плюсы:
парсим все фильмы без потерь
не надо дополнительно нигде регистрироваться
Минусы:
отсутствует imdbId
медленно
Немного про селениум.
Браузер открывается сам, пользователю нужно авторизоваться на КП и закрыть все лишние всплывающие окна. Парсинг работает следующим образом. Сейчас на КП вы можете на странице посмотреть только 20 оценок. Чтобы посмотреть следующие, необходимо перейти на следующую страницу. Селениум парсит название, год и id всех фильмов на странице, переходит на следующую. И так пока на странице не станет меньше 20 фильмов. Это значит, что это последняя страница. Далее по списку заходим на страницу каждого фильма и парсим оригинальное название. Оно необходимо для поиска фильма на imdb. Тут может возникнуть трудность. Если фильм условной Испании, то оригинальное название на испанском, а на imdb оно будет на английском. Если фильм русский, то оригинальное название отсутствует, на imdb название транслитом. Или же фильм, в названии которого только цифры. У него также может отсутствовать оригинальное название.
Если у вас например 505 оценок, то придётся парсить 26 страниц, чтобы собрать основную информацию. Но дальше больше. Необходимо пройти по каждому фильму отдельно и добрать необходимую оригинальное название фильма, так как на странице с оценками только российское. Итого получается надо открыть в браузере 26 + 505 = 531 страницу.
Пример парсинга моего профиля по времени (1530 фильмов):
75 страниц апи — примерно 45 секунд
77 страниц селениум — примерно 1 минута 23 секунды + парсинг каждого фильма, чтобы забрать оригинальное название. Уходит за 10 минут.

Спарсить можно оценки любого пользователя, равно как и посмотреть их самому. В приложении вы просто указываете id пользователя, и работа идет по нему.
После парсинга все фильмы сохраняются в дамп. Именно из него и проставляем оценки на imdb. Вначале всё было в памяти приложения до окончания парсинга, после данные сохранялись в дамп. Но горький опыт заставил меня обновлять дамп каждые 20 спарсенных фильмов. При повторном заходе по каждому фильму — по 5. А для апи каждые 100.
Проставление
Тут нюансов несколько меньше.
Данные берутся из дампа, полученного на этапе парсинга. Проставили 5 оценок, записали статус по ним в дамп, поехали дальше. Аналогично парсингу. При проставлении оценок на imdb также нужно авторизоваться на ресурсе и закрыть все лишние всплывающие окна.
По логике имеется только 1 развилка — есть ли imdbId или нет. Если есть — переходим по прямой ссылке и ставим оценку. Как уже известно, наличие imdbId не говорит о его корректности.
Бывает и такое



то есть оценка улетела не тому фильму
Но перепроверять его каждый раз значит отказаться вовсе.
Если же imdbId нету, то ищем фильм по оригинальному названию + год. В поиске может оказаться несколько подходящих вариантов

Мне очевидно какой подходящий, но приложению нет. Оно знает только название и год. Сначала бралось самое первое из списка, но не всегда порядок выстраивается как на скрине выше. Поэтому оценка могла улететь не туда. Затем, в случаях если вариантов несколько, сделали логику не проставлять оценку. Но такие результаты поиска сплошь и рядом, и получалось очень много пропусков.

После всё же вернулись к первоначальной реализации, добавив пару фильтров. Можно было бы ещё писать в дамп продолжительность фильмов, режиссера, актеров и так далее и сопоставлять по ним. Тогда качество поиска стало бы выше, но для домашнего использования это перебор.
Также у некоторых фильмов год на imdb и КП может отличаться ±1
Разные года


Статусы в дампе
Для обычного пользователя весь процесс проходит в приложении. Чтобы пользователь не паниковал и понимал, что сейчас происходит, был добавлен вывод логов. Но для меня вся информация хранится в дампе. Самое важное — статус. Что же именно произошло.
успешно. Оценка проставлена на imdb и подтверждена (после проставления прочитали на странице == оценке КП)
проставлено с оговоркой. Тоже проставлено и подтверждено, но выбор шёл через неоднозначную выдачу (≥2 точных матчей: выбрали по году ±1, либо первый по релевантности)
пропущено (уже стоит оценка). На imdb уже стоит оценка, и она равна оценке КП
руками (оценки отличаются). На imdb уже стоит оценка, но она не соответствует оценке на КП. Пользователь решает сам что делать.
неполные данные. Отсутствует название или оценка КП в дампе.
не найден. Поиск не нашёл фильм, либо неоднозначный выбор не прошёл верификацию (тип страницы не Movie/TVSeries, название/год не совпали)
ошибка.
Реальный дамп до некоторых исправлений

Первая строка — только год и kp_id. Статус — не найден, что вполне логично. Именно эта строка почему‑то дублируется несколько раз конкретно в этом дампе, возможно временная ошибка апи. Я проверил что это за фильм — какой‑то русский сериал, который пользователь даже не оценивал.
Вторая строка — тот же статус. При поиске видимо выдало что‑то не то.
Дальше ещё 4 строки, две со статусом успешно, две с одинаковой ошибкой. Причина — перехват клика, который сейчас уже исправлен.
В завершение
В настоящий момент стараюсь соблюдать баланс скорость — качество и для тех у кого 100 оценок, и для тех, у кого их 5000.
Свои оценки, если честно, я проставил ещё в режиме дебага. Но возник вопрос, как это сделать обычным людям. Вряд ли у многих из них стоит необходимое окружение. Поэтому агент помог написать десктоп (JavaFX). Я решил свою боль и даю возможность решить её обычным пользователям ПК.
Приложение не подойдет тем, у кого большинство фильмов — отечественные по уже изложенным в этой статье причинам. Но что‑то мне подсказывает, что им и не надо на imdb.
Не возьмусь утверждать насколько эффективно приложение, но по моему субъективному мнению, процентов на 85 так точно. Т.е. это те фильмы, которые корректно спарсились и корректно проставились.
Но есть и минусы. Из‑за того, что приложение работает в первую очередь с html, даже легкий редизайн одного из ресурсов может его поломать. Вряд ли будут трудности, чтобы это исправить, но это постоянная поддержка и обновления.
Конечно, есть мысли по улучшению, например единая база kpId — imdbId, чтобы ускорить и улучшить качество, но ещё думаю над реализацией.
Пользуйтесь, пробуйте, рассказывайте друзьям. Посмотреть код и скачать установщик можно тут — https://github.com/VladSmr/Notes
Спасибо за прочтение, буду рад обратной связи.

