Вход Регистрация

Кейсы

Получение данных с IMDb: кейс по веб-скрапингу

Узнайте, как извлечь данные с IMDb с помощью методов веб-скрапинга. Исследуйте инструменты, подходы и лучшие практики для эффективного сбора данных с IMDb.

Команда Froxy 23 янв 2025 7 мин
Получение данных с IMDb: кейс по веб-скрапингу

Сайт IMDb (полное название Internet Movie Database) – это самая популярная и свободно наполняемая база данных о фильмах, сериалах, актёрах, режиссёрах, сценаристах и т.п. Именно здесь можно изучить актуальные оценки зрителей, посмотреть статистику и кассовые сборы, награды, отзывы, описания, графики релизов, названия и списки серий, рейтинги, категории, жанры и прочую информацию. Примечательно, что для актёров и знаменитостей предлагается платная Pro-подписка – она предназначена для расширенного наполнения профилей и налаживания профессиональных связей.

Ресурс существует с 1990 года, база содержит записи о 14+ млн. актёрах и о 10+ млн. произведений. У IMDb есть API-интерфейс, но он очень дорогой. Ссылка на тарифы для понимания масштаба (от 150 тыс. $/год). Поэтому гораздо интересней вложиться в написание своего парсера IMDb.

Этот материал о том, как спарсить данные с IMDb и не попасть под блокировки.

Понимание структуры и разметки IMDb

Понимание структуры и разметки IMDb

Чаще всего данные с IMDb используются на сайтах, посвящённых кино и сериалам: фан-сайты, торрент-трекеры, онлайн-кинотеатры и прочее. Аналогично возможно применение в мобильных и ТВ-приложениях. Данные с IMDb нужны для организации описательной части (о кино, о сериале, о конкретной серии) или применяются для вывода актуальных оценок, отзывов (легендарный звёздный рейтинг IMDb от 1 до 10), статистики и т.п.

Специально для фан-сайтов предоставляется готовый «плагин». Правда, это не совсем плагин, по факту это web-сервис, который в ответ на ввод названия произведения, предоставляет готовый HTML-код для вставки на сторонние сайты. Виджет будет отображать актуальную зрительскую оценку к конкретному фильму.

Но всё не так просто, иначе бы этого материала не было.

Как IMDb организует свои данные

Если говорить об API, то доступ к актуальным данным можно получить только через AWS Data Exchange и только в JSON-формате. Существуют готовые наборы данных, но обратиться к ним за выборкой можно только через Афину Amazon (синтаксис чем-то напоминает выборку по SQL-таблицам).

Это было бы удобно, если бы не цены на доступ. Неудивительно, что энтузиасты организовали свою открытую базу – OMDb (Open Movie Database). Здесь до 1000 API-запросов в сутки можно получить бесплатно. Открытая база конечно же, никак не аффилирована с IMDb.

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

Сайт IMDb разбит на следующие разделы: ТОП-250 фильмов, релиз-календарь, самые популярные видео, лучшие кассовые сборы, новости, ТВ-шоу (во много повторяется структура кино-контента), награды и события (Оскар, лучшие за год, награды STARmeter и т.п.), селебрити/звёзды (самые популярные, карточки описаний, достижений и наград, списки созданного контента или контента с участием, новости и прочее), трейлеры, что посмотреть, голосования и некоторые другие разделы.

Наиболее информативными являются страницы конкретных фильмов или сериалов, а также страницы, посвящённые актёрам и знаменитостям (режиссёрам, сценаристам, ведущим ТВ-шоу).

Естественно, каждая из страниц имеет свою уникальную HTML-разметку и свой набор отображаемых данных.

Например, на страницах, посвящённым кино, можно найти все ключевые данные IMDb:

  • Название (оригинальное – на языке страны создания, а также перевод для страны просмотра, выводится на основе текущего региона подключения пользователя).
  • Оценки (общий звёздный рейтинг, а также ваша оценка, если вы её ставили, оценка критиков и отдельно пользователей).
  • Статистику (для понимания популярности и востребованности за последнее время).
  • Длительность.
  • Дату релиза / выхода в прокат.
  • Возрастные ограничения и сертификаты.
  • Постеры, трейлеры, скрины и другой связанный с произведением медиаконтент.
  • Жанры и теги (категории и таксономии, с которыми соотносится произведение).
  • Список актёров, авторов сценария, директоров, режиссёров и других участников съёмочной группы.
  • Полученные награды и номинации.
  • Списки похожих фильмов (подбираются по совокупности факторов, алгоритм не разглашается).
  • Описание сюжетной линии.
  • Интересные факты.
  • Информацию о саундтреках.
  • Отзывы пользователей.
  • А также массу других данных (ссылки на официальные сайты, альтернативные названия, места съёмок, производственная компания, бюджет, сборы, технические параметры видеоряда, связанный контент, например, последующие части или серии, и пр.).
Резидентные прокси

Лучшие прокси-серверы для доступа к ценным данным со всего мира.

Тарифы $1.99, 100Mb

Ключевые URL-адреса и параметры для навигации по структуре сайта IMDb

Самые важные URL-адреса для парсера IMDb:

https://www.imdb.com/title/tt0068646/

Цифровой идентификатор в конце соответствует определённому фильму. По ссылке из примера откроется «Крёстный отец».

Перебирая идентификаторы, можно спарсить абсолютно все фильмы из базы IMDb (напомним, их там свыше 10 млн.).

С помощью дополнительных параметров можно получить более конкретную информацию:

  • …/movieconnections/ – перенаправит на страницу со связанным контентом. В случае с «Крёстным отцом» вы найдёте список всех последующих частей, сериалов и релизов.
  • …/ratings/ – перенаправит на страницу с подробностями о том, как формируется звёздный рейтинг фильма (визуальное отображение долей пользователей, поставивших ту или иную оценку).
  • …/videogallery/ – ведёт на страницу с видеоконтентом (трейлеры, катсцены и т.п.).
  • …/mediaviewer/ – библиотека картинок (скринов, фотографий и прочего).
  • …/fullcredits/ – отдельная страница с подробным перечислением актёров и участников съёмочных групп.
  • …/plotsummary/ – детальное текстовое описание фильма (синопсис и резюме).
  • …/reviews/ – страница с отзывами о фильме. Отзывы можно сортировать с помощью параметров, передаваемых в URL. Например, конструкция …/reviews/?rating=10&sort=submission_date%2Cdesc выведет отзывы с оценкой 10 с убыванием даты (от новой к старым).
  • …/awards/ – страница с наградами.

А вот так выглядят URL для описания знаменитостей:

https://www.imdb.com/name/nm0000246/

Указанный адрес ведёт на страницу Брюса Уиллиса.

Как можно было догадаться, перебор идентификатора в конце будет приводить на новые страницы знаменитостей.

Тут тоже есть модификаторы: …/awards/ (награды), …/bio/ (биография), …/trivia/ (интересные факты), …/videogallery/ (галерея видео) и т.п.

Но больше всего интересна логика обращения к встроенной системе поиска.

Пример поискового запроса, описанного в структуре URL-адреса:

https://www.imdb.com/search/title/?title=Godfather&title_type=feature&release_date=1970-01-01,1980-12-31&user_rating=1

Здесь ищется фильм (тип «feature») с заголовком «Godfather», выпущенный с января 1970 года по декабрь 1980 года («release_date=1970-01-01,1980-12-31»), с рейтингом 1 и выше.

А вот так можно искать конкретных актёров (ищем Аль Пачино, на английском Al Pacino):

https://www.imdb.com/search/name/?name=Al%20Pacino

Можно даже подобрать ТВ-программы, фильмы и другой контент, который связан с двумя знаменитостями сразу:

https://www.imdb.com/search/title/?role=nm0000246,nm0000199

Система вернёт содержимое, где будут встречаться одновременно Аль Пачино и Брюс Уиллис (в поисковом запросе указываются их идентификаторы).

Условия обслуживания IMDb и правила парсинга веб-страниц

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

Парсинг IMDb запрещён в явном виде – на уровне условий использования сервиса. Получить разрешение на парсинг IMDb можно только в письменном виде, для этого нужно обратиться к представителям Отдела лицензирования. В большинстве случаев правила действуют для США, так как компания и сайт относятся их юрисдикции.

Тем не менее, обнаружить факт парсинга и доказать нарушение условий лицензирования практически невозможно, если вы не используете прямые атрибуты IMDb: логотипы, фирменные названия (торговые марки) и прочее.

Названия фильмов, ТВ-шоу и списки актёров даже технически не могут принадлежать IMDb. Поэтому сайт можно смело парсить и данные использовать для своих задач. Например, чтобы найти рейтинг лучших фильмов по определённым критериям или вывести оценку фильма (без прямой привязки к IMDb).

P.S.: В условиях использования плагина (иконки с рейтингом) указано, что его можно вставлять только на личных сайтах и блогах. Видео- и стриминговые сервисы, онлайн-кинотеатры, рекомендательные сайты и другие коммерческие сервисы должны запрашивать заключение официального лицензионного соглашения, так как плагин содержит узнаваемый товарный знак IMDb.

Поддержка 24/7

Наша команда поддержки поможет вам всегда оставаться онлайн и не останавливаться на достигнутом.

Get Support

Создание парсера IMDb

Большинство готовых парсеров для IMDb написаны на Python. Вот несколько примеров, если вам не терпится начать прямо сейчас (без написания своего кода): JohnDoee/imdbparser, python-automation-scripts/imdb-scraper/ (как часть набора со скриптами автоматизации), PyMovieDb, IMDB-Scraper и т.д.

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

Чтобы повысить градус ответственности, мы будем использовать язык Golang. Для него тоже есть готовые IMDb-парсеры, но заметно меньше: GMDB, imdb-scraping-and-analysing, IMDB-Scraper-Golang.

Актуальные проблемы парсинга IMDb

Обратите внимание! Практически все готовые решения для парсинга данных с IMDb с недавних пор не работают!

Дело в том, что с того момента, как IMDb предложил платный доступ по API, администрация сайта неплохо защитила данные на своих страницах:

  • Во-первых, фронтэнд сайта стал полностью динамическим (он состоит только из JavaScript-кода). То есть для доступа к результирующему HTML вам потребуется headless-браузер или антидетект.
  • Во-вторых, все названия CSS-классов намеренно уникализируются с помощью специальных переменных. Это приводит к тому, что на каждой новой странице один и тот же элемент, например, блок с выводом итогового рейтинга, будет иметь новое название класса и идентификатор. Найти повторяющиеся паттерны в HTML-структуре нереально. Никакие XPath вам не помогут.

В таких условиях можно попробовать привязаться только к NodeID (data-testid)-параметрам. Но и тут есть подводные камни.

Как итог, нужно писать свой IMDb-парсер с нуля – со сложной системой поиска элементов на страницах.

В целях упрощения подачи мы решили использовать Golang в связке с библиотекой chromedp. Вы можете посмотреть и другие библиотеки для Golang.

Настройка среды парсинга

Скачиваем и устанавливаем среду исполнения Golang для своей платформы – официальная страница загрузки. При желании можно установить и настроить Git-клиент (если его ещё нет в системе).

Далее нужно создать каталог, где будут храниться файлы нашего проекта. Пусть это будет диск C и папка «My-IMDb-parser». Создание папки можно выполнить вручную или через терминал:

mkdir \My-IMDb-parser

Теперь переходим в наш каталог:

cd \My-IMDb-parser

И создаём свой проект с парсером данных IMDb (команда для терминала):

go mod init My-IMDb-parser

Чтобы получить возможность доступа к результирующему HTML-коду, нам нужен headless-браузер. Будет обращаться к уже установленному Google Chrome через библиотеку chromedp (наш материал по ней):

go get -u github.com/chromedp/chromedp

Дождитесь скачивания и установки модуля, а также всех зависимых библиотек (они должны подтянуться автоматически).

Теперь можно приступать к программированию своего первого IMDb-парсера.

Глобальное покрытие

6 континентов, никаких ограничений

Получите доступ к прокси-сети с 200+ локациями и 10+ миллионами IP-адресов.

Тарифы

Написание кода

Сначала создайте стартовый файл проекта. Пусть это будет «My-IMDb-parser.go».

Для этого в проводнике перейдите в каталог проекта и создайте простой текстовый файл с нужным именем, а затем смените расширение на «.go».

Откройте файл в текстовом редакторе и перенесите в него код:

package main// Импортируем модулиimport ("context""fmt""github.com/chromedp/cdproto/cdp""github.com/chromedp/chromedp""log")// Наша структура данных о звёздах/знаменитостях, которую будем использовать для хранения уже после извлечения (пока только переменная name)type Star struct {name string}// создаём главную функцию своей программыfunc main() {// чтобы отслеживать все данные, создадим переменную stars и массив []Starvar stars []Star// Инициализируем экземпляр headless-хромаctx, cancel := chromedp.NewContext(context.Background(),)// закрываем его, если не используемdefer cancel()// Тут логика автоматизации браузераvar starNodes []*cdp.Nodeerr := chromedp.Run(ctx,chromedp.Navigate("https://www.imdb.com/search/name/?birth_monthday=03-07"), //целевая страница//прямо внутри URL-адреса передаются параметры поиска, в нашем случае месяц и день рождения знаменитости// можно заменить их на свои значения в формате MM-DDchromedp.Nodes(".ipc-title-link-wrapper", &starNodes, chromedp.ByQueryAll), //ищем все карточки с именами звёзд в результатах выдачи, они имеют класс ipc-title-link-wrapper)//заодно наполняем ошибкиif err != nil {log.Fatal("Ошибка:", err)}// логика парсингаvar name stringfor _, node := range starNodes {// достаём данные из HTML карточки поискаerr = chromedp.Run(ctx,// собираем текст из тега H3, наше названиеchromedp.Text("h3", &name, chromedp.ByQuery, chromedp.FromNode(node)),)//тут вывод ошибок, если естьif err != nil {log.Fatal("Ошибка:", err)}// запускаем новый процесс, но уже для структурирования данных парсингаstar := Star{}star.name = namestars = append(stars, star)}//Выводим список знаменитостей, родившихся 03-07fmt.Println(stars)}

Запуск нашего IMDb-парсера

Сохраните файл и запустите его из консоли:

cd \My-IMDb-parsergo run My-IMDb-parser.go

После отработки в консоли будет выведен список знаменитостей, родившихся 7 марта (03-07).

При желании можно изменить параметры поиска. В нашем случае нужно просто изменить дату.

Заключение и рекомендации

парсить данные с IMDb

Если вам нужен более сложный функционал, например, парсинг оценки фильма (пользовательского рейтинга) и другого контента, то придётся попотеть. Вся проблема в том, что сайт неплохо защищён: обязательно нужен headless-браузер и обход защиты с рандомизацией CSS-классов.

Даже если указанные проблемы вы сможете решить, спарсить данные с IMDb будет непросто, ведь одних только фильмов в базе содержится свыше 10 млн.

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

Найти качественные прокси с автоматической ротацией по временим или при каждом новом запросе, можно у нас. Froxy – это 10+ млн. белых IP-адресов, мобильных и резидентных. Оплачивается только трафик, подбор прокси производится с точностью до города и оператора связи.

Получайте уведомления о новых функциях и обновлениях Froxy

Узнайте первыми о новых функциях Froxy, чтобы оставаться в курсе событий происходящих на рынке цифровых технологий и получать новости о новых функциях Froxy.

Статьи по Теме

Обзор лучших библиотек для веб-скрапинга на Java

Парсинг

Обзор лучших библиотек для веб-скрапинга на Java

Узнайте о лучших библиотеках Java для веб-скрапинга, их возможностях, применении и преимуществах. Найдите подходящие инструменты для эффективного...

Команда Froxy 16 янв 2025 8 мин
Извлечение данных из LinkedIn с помощью Python: Пошаговое руководство

Парсинг

Извлечение данных из LinkedIn с помощью Python: Пошаговое руководство

В этом подробном пошаговом руководстве вы узнаете, как собирать данные LinkedIn с помощью Python. Откройте для себя основные этапы и парсите...

Команда Froxy 10 окт 2024 7 мин