Сайт IMDb (полное название Internet Movie Database) – это самая популярная и свободно наполняемая база данных о фильмах, сериалах, актёрах, режиссёрах, сценаристах и т.п. Именно здесь можно изучить актуальные оценки зрителей, посмотреть статистику и кассовые сборы, награды, отзывы, описания, графики релизов, названия и списки серий, рейтинги, категории, жанры и прочую информацию. Примечательно, что для актёров и знаменитостей предлагается платная Pro-подписка – она предназначена для расширенного наполнения профилей и налаживания профессиональных связей.
Ресурс существует с 1990 года, база содержит записи о 14+ млн. актёрах и о 10+ млн. произведений. У IMDb есть API-интерфейс, но он очень дорогой. Ссылка на тарифы для понимания масштаба (от 150 тыс. $/год). Поэтому гораздо интересней вложиться в написание своего парсера 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:
- Название (оригинальное – на языке страны создания, а также перевод для страны просмотра, выводится на основе текущего региона подключения пользователя).
- Оценки (общий звёздный рейтинг, а также ваша оценка, если вы её ставили, оценка критиков и отдельно пользователей).
- Статистику (для понимания популярности и востребованности за последнее время).
- Длительность.
- Дату релиза / выхода в прокат.
- Возрастные ограничения и сертификаты.
- Постеры, трейлеры, скрины и другой связанный с произведением медиаконтент.
- Жанры и теги (категории и таксономии, с которыми соотносится произведение).
- Список актёров, авторов сценария, директоров, режиссёров и других участников съёмочной группы.
- Полученные награды и номинации.
- Списки похожих фильмов (подбираются по совокупности факторов, алгоритм не разглашается).
- Описание сюжетной линии.
- Интересные факты.
- Информацию о саундтреках.
- Отзывы пользователей.
- А также массу других данных (ссылки на официальные сайты, альтернативные названия, места съёмок, производственная компания, бюджет, сборы, технические параметры видеоряда, связанный контент, например, последующие части или серии, и пр.).
Резидентные прокси
Лучшие прокси-серверы для доступа к ценным данным со всего мира.
Ключевые 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
Наша команда поддержки поможет вам всегда оставаться онлайн и не останавливаться на достигнутом.
Создание парсера 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 и массив []Star
var stars []Star
// Инициализируем экземпляр headless-хрома
ctx, cancel := chromedp.NewContext(
context.Background(),
)
// закрываем его, если не используем
defer cancel()
// Тут логика автоматизации браузера
var starNodes []*cdp.Node
err := chromedp.Run(ctx,
chromedp.Navigate("https://www.imdb.com/search/name/?birth_monthday=03-07"), //целевая страница
//прямо внутри URL-адреса передаются параметры поиска, в нашем случае месяц и день рождения знаменитости
// можно заменить их на свои значения в формате MM-DD
chromedp.Nodes(".ipc-title-link-wrapper", &starNodes, chromedp.ByQueryAll), //ищем все карточки с именами звёзд в результатах выдачи, они имеют класс ipc-title-link-wrapper
)
//заодно наполняем ошибки
if err != nil {
log.Fatal("Ошибка:", err)
}
// логика парсинга
var name string
for _, 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 = name
stars = append(stars, star)
}
//Выводим список знаменитостей, родившихся 03-07
fmt.Println(stars)
}
Запуск нашего IMDb-парсера
Сохраните файл и запустите его из консоли:
cd \My-IMDb-parser
go run My-IMDb-parser.go
После отработки в консоли будет выведен список знаменитостей, родившихся 7 марта (03-07).
При желании можно изменить параметры поиска. В нашем случае нужно просто изменить дату.
Заключение и рекомендации
Если вам нужен более сложный функционал, например, парсинг оценки фильма (пользовательского рейтинга) и другого контента, то придётся попотеть. Вся проблема в том, что сайт неплохо защищён: обязательно нужен headless-браузер и обход защиты с рандомизацией CSS-классов.
Даже если указанные проблемы вы сможете решить, спарсить данные с IMDb будет непросто, ведь одних только фильмов в базе содержится свыше 10 млн.
Для кратного ускорения процесса скрейпинга нужно задействовать ротируемые прокси. К слову, они легко подключаются к библиотеке chromedp, которую мы использовали в примере, как и к любому другому софту или библиотекам.
Найти качественные прокси с автоматической ротацией по временим или при каждом новом запросе, можно у нас. Froxy – это 10+ млн. белых IP-адресов, мобильных и резидентных. Оплачивается только трафик, подбор прокси производится с точностью до города и оператора связи.