Как парсить IMDb на Python: рабочий код без ошибок

Последнее обновление April 16, 2026

Если вы недавно искали, как "scrape IMDb with Python", то наверняка заметили одну вещь: большинство найденных туториалов уже не работают. И речь не о том, что они просто слегка устарели — скорее они либо возвращают ноль результатов, либо заваливают вас NoneType-ошибками.

Последние несколько недель я тестировал все крупные гайды по парсингу IMDb, какие только смог найти — GeeksforGeeks, Medium, freeCodeCamp, ноутбуки на Kaggle и многое другое. Из , помеченных как инструменты для IMDb scraping, подавляющее большинство ссылаются на CSS-селекторы (td.titleColumn, td.ratingColumn), которых не существует с июня 2023 года, когда IMDb обновил страницу Top 250. Итог? Форумы, заваленные вопросами разработчиков вроде "почему мой код возвращает пусто?", и мейнтейнеры популярных библиотек, таких как : "We can't do much about it, besides fixing every parser." В этом руководстве мы разберем два Python-способа, которые действительно работают прямо сейчас, объясним, как обрабатывать пагинацию и типичные ошибки, когда Python вообще не лучший выбор, и как сделать парсер более живучим, чтобы он не пополнил кладбище сломанных скриптов.

Что значит парсить IMDb на Python?

Веб-скрапинг — это программное извлечение данных со страниц сайта. Вместо того чтобы вручную копировать и вставлять информацию, вы пишете скрипт, который делает это автоматически. Когда мы говорим о "scraping IMDb", мы имеем в виду сбор структурированных данных о фильмах — названий, рейтингов, жанров, актёрского состава, хронометража, числа голосов — со страниц IMDb с помощью Python.

Обычно для этого используют три библиотеки: requests — чтобы получить HTML-страницу, BeautifulSoup — чтобы разобрать HTML и найти нужные данные, и pandas — чтобы упорядочить результаты и сохранить их в файл. В некоторых туториалах также используют Selenium или Playwright для страниц, где контент подгружается через JavaScript, но, как вы увидите дальше, есть и более быстрые варианты.

Важное замечание: все примеры в этом руководстве проверены на текущей структуре IMDb по состоянию на середину 2025 года. IMDb меняет разметку примерно раз в 6–12 месяцев, так что если вы читаете это в 2027-м, часть селекторов могла измениться. Я тоже объясню, как к этому подготовиться.

Зачем парсить IMDb на Python? Реальные сценарии использования

Прежде чем писать хоть строчку кода, стоит понять: что вы вообще будете делать с данными IMDb? Ответ зависит от вашей роли.

Датасет с отзывами IMDb — один из самых популярных бенчмарков в мире NLP. Основополагающая статья Maas et al. (2011) получила , а сам датасет встроен в TensorFlow, Keras и PyTorch. На Hugging Face датасет stanfordnlp/imdb скачивают 213,321 раз в месяц, и на нём обучили более 1,500 моделей. Так что если вы работаете в машинном обучении, с IMDb-данными вы, скорее всего, уже знакомы.

Но сценарии применения далеко не ограничиваются академией:

СценарийКому подходитКакие данные нужны
Рекомендательная система для фильмовData scientists, энтузиастыНазвания, жанры, рейтинги, актёры
Контент-стратегия для стриминговой платформыПродуктовые и контент-командыРейтинги, голоса, год выпуска, жанры
Анализ тональности / обучение NLP-моделейML-исследователи, студентыОтзывы, рейтинги
Анализ контента конкурентовАналитики индустрии развлеченийКассовые сборы, даты релиза, динамика рейтингов
Исследования film tourismТуристические офисы, travel-компанииМеста съёмок, метрики популярности
Академические исследованияУниверситетские исследователиЛюбые структурированные метаданные о фильмах

Только рынок film tourism оценивается примерно в . Netflix в 2024 году потратил на контент более $17 млрд, а обеспечиваются персонализированными рекомендациями. Иными словами, данные IMDb влияют на реальные решения в разных отраслях.

Какие есть способы получить данные IMDb, прежде чем писать код

Этот раздел большинство туториалов просто пропускает. Они сразу предлагают pip install beautifulsoup4, не задаваясь вопросом: а нужен ли вам вообще Python-скрапинг в этой ситуации?

Вот полный набор вариантов:

ПодходЛучше всего подходит дляПлюсыМинусы
Python + BeautifulSoupОбучения и кастомного парсингаПолный контроль, гибкостьХрупкие селекторы, часто ломается
Извлечение JSON-LD / __NEXT_DATA__Разработчиков, которым важна стабильностьРаботает с JS-контентом, более устойчивоНужно понимать структуру JSON
Официальные датасеты IMDbКрупномасштабного анализа, академических задачЗаконно, полно, 26M+ тайтлов, ежедневные обновленияФормат TSV, нет отзывов/изображений
Библиотека Cinemagoer (IMDbPY)Программного доступа к данным по конкретным тайтламPython-API, богатые поля88 открытых issue, последний релиз в мае 2023
TMDb APIМетаданные фильмов + изображенияБесплатный API-ключ, JSON, хорошая документацияДругой источник данных (не IMDb ratings)
Thunderbit (no-code)Тем, кто не пишет код, и для быстрых выгрузокСкрейпинг в 2 клика, AI сам предлагает поля, экспорт в Excel/SheetsДля больших объёмов работает по кредитной модели

Несколько замечаний по этим вариантам. У Cinemagoer не было релиза в PyPI с мая 2023 года, а после редизайна IMDb в июне 2025-го сломалась большая часть парсеров — для production я бы его сейчас не рекомендовал. TMDb отличен, но использует собственную систему рейтингов, а не IMDb. А официальный enterprise API IMDb через AWS Data Exchange стоит , так что большинству он просто не по карману.

Для тех, кто не хочет писать код вообще, читает страницу IMDb, автоматически предлагает поля для извлечения (title, rating, year, genre) и за два клика экспортирует данные в Excel, Google Sheets, Airtable или Notion. AI подстраивается, когда IMDb меняет макет страницы, так что поддерживать селекторы не нужно. Об этом ещё поговорим.

А теперь — для тех, кто всё же хочет писать на Python — вот два рабочих метода.

Метод 1: парсинг IMDb на Python через BeautifulSoup (классический подход)

Это классический способ, который вы найдёте в большинстве туториалов. Он работает, но скажу честно: это самый хрупкий из методов, которые я здесь покажу. CSS-классы IMDb генерируются автоматически и меняются при редизайне. При этом именно этот подход лучше всего подходит для изучения основ веб-скрапинга.

Шаг 1: установите и импортируйте библиотеки Python

Вам понадобятся четыре пакета:

1pip install requests beautifulsoup4 pandas lxml

Что делает каждый из них:

  • requests — отправляет HTTP-запросы и получает страницу
  • beautifulsoup4 — разбирает HTML, чтобы можно было искать нужные элементы
  • pandas — приводит извлечённые данные к табличному виду и экспортирует их в CSV/Excel
  • lxml — быстрый HTML-парсер (BeautifulSoup может использовать его как backend)

Импорт:

1import requests
2from bs4 import BeautifulSoup
3import pandas as pd

Шаг 2: отправьте HTTP-запрос к IMDb

Здесь большинство новичков впервые упираются в стену. IMDb блокирует запросы без нормального заголовка User-Agent — в ответ вы получите ошибку 403 Forbidden. Стандартная строка user-agent в Python Requests (python-requests/2.31.0) определяется мгновенно.

1url = "https://www.imdb.com/chart/top/"
2headers = {
3    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
4    "Accept-Language": "en-US,en;q=0.9"
5}
6response = requests.get(url, headers=headers)
7if response.status_code != 200:
8    print(f"Не удалось получить страницу: {response.status_code}")
9else:
10    print("Страница успешно загружена")

Заголовок Accept-Language тоже важен — без него IMDb может отдать контент на другом языке в зависимости от геолокации вашего IP.

Шаг 3: разберите HTML с помощью BeautifulSoup

Когда HTML уже получен, создайте объект BeautifulSoup и начните искать нужные элементы. Откройте страницу IMDb Top 250 в Chrome, кликните правой кнопкой по названию фильма и выберите "Inspect", чтобы увидеть структуру HTML.

1soup = BeautifulSoup(response.text, "lxml")

По состоянию на середину 2025 года страница Top 250 использует такие селекторы:

  • Контейнер фильма: li.ipc-metadata-list-summary-item
  • Название: h3.ipc-title__text
  • Год: span.cli-title-metadata-item (первый span)
  • Рейтинг: span.ipc-rating-star--rating

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

Шаг 4: извлеките данные фильма (название, год, рейтинг)

Здесь я делаю не так, как большинство туториалов: добавляю обработку ошибок через try/except. Ни один из конкурирующих гайдов, которые я проверил, этого не делает — именно поэтому их код ломается молча, когда селектор меняется.

1movies = []
2movie_items = soup.select("li.ipc-metadata-list-summary-item")
3for item in movie_items:
4    try:
5        title_tag = item.select_one("h3.ipc-title__text")
6        title = title_tag.text.strip() if title_tag else "N/A"
7        year_tag = item.select_one("span.cli-title-metadata-item")
8        year = year_tag.text.strip() if year_tag else "N/A"
9        rating_tag = item.select_one("span.ipc-rating-star--rating")
10        rating = rating_tag.text.strip() if rating_tag else "N/A"
11> This paragraph contains content that cannot be parsed and has been skipped.
12print(f"Извлечено {len(movies)} фильмов")

Шаг 5: сохраните данные в CSV или Excel через Pandas

1df = pd.DataFrame(movies)
2df.to_csv("imdb_top_250.csv", index=False)
3df.to_excel("imdb_top_250.xlsx", index=False)
4print(df.head())

Пример вывода:

1                          title  year rating
20  1. The Shawshank Redemption  1994    9.3
31           2. The Godfather    1972    9.2
42     3. The Dark Knight        2008    9.0
53  4. The Godfather Part II     1974    9.0
64         5. 12 Angry Men       1957    9.0

Да, это работает. Но всё держится на CSS-селекторах, которые могут сломаться в любой день — и это подводит нас к подходу, который я действительно рекомендую.

Метод 2: трюк с JSON-LD — вообще без HTML-парсинга

Это техника, о которой не пишет ни одна статья конкурентов, и именно её я бы использовал для серьёзного проекта. IMDb встраивает структурированные данные в формате (JavaScript Object Notation for Linked Data) в теги <script type="application/ld+json"> на каждой странице. Эти данные следуют стандарту Schema.org, используются Google для расширенных результатов поиска и меняются куда реже, чем CSS-классы.

Продакшен-инструмент Apify IMDb Scraper использует такой приоритет извлечения данных: "JSON-LD > NEXT_DATA > DOM". Именно такую иерархию я бы рекомендовал тоже.

Почему JSON-LD надёжнее, чем CSS-селекторы

This paragraph contains content that cannot be parsed and has been skipped.

CSS-классы вроде ipc-metadata-list-summary-item автоматически генерируются React-системой IMDb и меняются при каждом редизайне. JSON-LD описывает реальные данные, а не то, как они отрисованы на странице. Это примерно как разница между оглавлением книги и попыткой понять главы по размеру шрифта.

css-selectors-vs-json-ld.webp

Пошагово: извлекаем данные IMDb из JSON-LD

Шаг 1: получите страницу

Тот же принцип, что и раньше — используйте requests с корректным заголовком User-Agent.

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5> This paragraph contains content that cannot be parsed and has been skipped.
6response = requests.get(url, headers=headers)
7soup = BeautifulSoup(response.text, "lxml")

Шаг 2: найдите тег script с JSON-LD

1script_tag = soup.find("script", {"type": "application/ld+json"})
2if not script_tag:
3    print("На странице не найден JSON-LD")
4else:
5    data = json.loads(script_tag.string)
6    print(f"Найден JSON-LD с типом: {data.get('@type', 'unknown')}")

Шаг 3: разберите структурированные данные

На странице Top 250 в JSON-LD содержится массив itemListElement со всеми 250 фильмами. Каждый элемент включает позицию, название, URL, aggregateRating, дату выпуска, жанр, описание, режиссёра и массив актёров.

1movies = []
2for item in data.get("itemListElement", []):
3    movie = item.get("item", {})
4    rating_info = movie.get("aggregateRating", {})
5> This paragraph contains content that cannot be parsed and has been skipped.
6#### Шаг 4: экспортируйте в CSV
7```python
8df = pd.DataFrame(movies)
9df.to_csv("imdb_top_250_json_ld.csv", index=False)
10print(df.head())

Пример вывода:

1   rank                      title                                     url  rating  vote_count date_published              genre
20     1  The Shawshank Redemption  https://www.imdb.com/title/tt0111161/     9.3     2900000     1994-10-14     Drama
31     2            The Godfather   https://www.imdb.com/title/tt0068646/     9.2     2000000     1972-03-24     Crime, Drama
42     3          The Dark Knight   https://www.imdb.com/title/tt0468569/     9.0     2800000     2008-07-18     Action, Crime, Drama

Все 250 фильмов. Чисто, структурированно, без плясок с CSS-селекторами. А поскольку данные следуют стандарту Schema.org, на котором Google строит расширенные результаты поиска, они куда менее склонны ломаться, чем визуальная разметка.

Бонус: __NEXT_DATA__ для страниц отдельных фильмов

Для более богатых данных на странице конкретного тайтла — например, хронометража, полного актёрского состава, сюжета, постеров — IMDb также встраивает JSON-объект __NEXT_DATA__. Это данные, которые React использует для гидратации страницы, и убрать их нельзя без поломки сайта.

1# На странице отдельного фильма, например /title/tt0111161/
2next_data_tag = soup.find("script", {"id": "__NEXT_DATA__"})
3if next_data_tag:
4    next_data = json.loads(next_data_tag.string)
5    above_fold = next_data["props"]["pageProps"]["aboveTheFoldData"]
6    title = above_fold["titleText"]["text"]
7    year = above_fold["releaseYear"]["year"]
8    rating = above_fold["ratingsSummary"]["aggregateRating"]
9    runtime_seconds = above_fold.get("runtime", {}).get("seconds", 0)
10    genres = [g["text"] for g in above_fold["genres"]["genres"]]
11    plot = above_fold["plot"]["plotText"]["plainText"]

Используйте JSON-LD для списков и чартов, а __NEXT_DATA__ — для отдельных страниц фильмов. Это уже production-уровень.

Почему ваш IMDb-скрейпер постоянно ломается и как это исправить

Это самая частая проблема, о которой пишут на форумах по парсингу IMDb. Пользователи жалуются: "Some of the code broke because of UI changes" и "Not working in 2024!" — а в ответ обычно тишина или совет "попробуйте Selenium".

Корневая причина — постоянный переход IMDb на фронтенд на React/Next.js. Вот хронология крупных изменений, которые ломали старые скрипты:

ДатаЧто изменилосьЧто сломалось
Ноябрь 2022Обновлены страницы имёнСтарые парсеры страниц имён
Июнь 2023Переработана страница Top 250Все селекторы td.titleColumn / td.ratingColumn
Апрель 2023Переработаны подстраницы тайтловПарсеры биографий, наград, новостей
Октябрь 2023Переработан расширенный поискСкрипты, завязанные на поиске
Июнь 2025Переработаны страницы /referenceБиблиотека Cinemagoer (большая часть парсеров)

Это примерно одно серьёзное ломающее изменение каждые 6–12 месяцев. Если ваш скрейпер завязан на CSS-классах, вы бежите по бесконечной дорожке.

Частые ошибки и как их исправить

Пустые результаты / NoneType-ошибки

Самая частая ошибка. Вы увидите AttributeError: 'NoneType' object has no attribute 'text'. Это значит, что BeautifulSoup не нашёл нужный элемент — обычно потому, что CSS-класс изменился или контент рендерится через JavaScript.

Решение: переключитесь на извлечение JSON-LD (Метод 2 выше). Данные уже есть в исходном HTML, JavaScript не нужен.

403 Forbidden

IMDb использует для обнаружения и блокировки ботов. Главный триггер — отсутствие нормального заголовка User-Agent или явно поддельная строка. Это подтверждается в open-source проектах и , где сотрудник IMDb признал проблему.

Решение: всегда указывайте реалистичный browser User-Agent и заголовок Accept-Language: en-US. Используйте requests.Session() для переиспользования соединений.

Возвращается только 25 результатов

Страницы поиска IMDb и списки "Most Popular" используют lazy loading — сначала они показывают примерно 25 результатов, а остальные догружают через AJAX при прокрутке.

Решение: используйте пагинацию через URL-параметры (об этом в следующем разделе) или перейдите на страницу Top 250, где все 250 фильмов загружаются одним ответом.

Селекторы внезапно перестали работать

Старые селекторы, которые больше не работают: td.titleColumn, td.ratingColumn, .lister-item-header, .inline-block.ratings-imdb-rating. Если ваш код использует что-то из этого, он сломан.

Решение: отдавайте предпочтение атрибутам data-testid (например, h1[data-testid="hero-title-block__title"]) вместо автоматически сгенерированных классов. Ещё лучше — используйте JSON-LD.

Логика выбора: краткосрочные и долгосрочные решения

  • Быстрое исправление: оберните каждый селектор в try/except, проверяйте HTTP-статус и логируйте ошибки, а не падайте целиком
  • Среднесрочное исправление: переходите с CSS-селекторов на JSON-LD (Метод 2)
  • Долгосрочное решение: используйте для больших объёмов данных или инструмент вроде , который каждый раз заново считывает структуру страницы с помощью AI — без селекторов, которые нужно поддерживать; AI автоматически адаптируется к изменениям макета

Как обойти ограничение в 25 результатов: пагинация IMDb и большие датасеты

Каждый конкурентный туториал, который я смотрел, парсит ровно одну страницу. Пагинацию почти никто не объясняет. Но если вам нужно больше, чем один список, вы очень быстро упрётесь в ограничения.

Страницы, которым пагинация не нужна

Хорошая новость: страница Top 250 загружает все 250 фильмов одним server-rendered ответом. И JSON-LD, и __NEXT_DATA__ содержат полный набор данных. Пагинация не нужна.

Как работает пагинация в поиске IMDb

Страницы поиска IMDb используют URL-параметр start=, который увеличивается на 50:

1https://www.imdb.com/search/title/?groups=top_1000&start=1
2https://www.imdb.com/search/title/?groups=top_1000&start=51
3https://www.imdb.com/search/title/?groups=top_1000&start=101

Вот Python-цикл для прохода по страницам:

1import time
2all_movies = []
3for start in range(1, 1001, 50):  # Проходим по top 1000
4    url = f"https://www.imdb.com/search/title/?groups=top_1000&start={start}"
5    response = requests.get(url, headers=headers)
6    if response.status_code != 200:
7        print(f"Сбой на start={start}: {response.status_code}")
8        break
9    soup = BeautifulSoup(response.text, "lxml")
10    # Извлеките фильмы выбранным вами способом
11    # ...
12    print(f"Страница, начинающаяся с {start}, обработана")
13    time.sleep(3)  # Не спешите — IMDb блокирует после ~50 быстрых запросов

time.sleep(3) действительно важен. По сообщениям сообщества, IMDb начинает блокировать IP примерно после 50 быстрых запросов. Случайная пауза в 2–5 секунд — хорошая практика.

Когда лучше вообще не скрапить: официальные bulk-датасеты IMDb

Для действительно больших задач IMDb предоставляет 7 бесплатных TSV-файлов на , которые обновляются ежедневно:

ФайлСодержимоеРазмер
title.basics.tsv.gzНазвания, типы, жанры, длительность, год~800 MB
title.ratings.tsv.gzСредний рейтинг, число голосов~25 MB
title.crew.tsv.gzРежиссёры, сценаристы~300 MB
title.principals.tsv.gzОсновной актёрский состав и ключевая команда~2 GB
title.akas.tsv.gzАльтернативные названия по регионам~1.5 GB
title.episode.tsv.gzДанные по ТВ-эпизодам~200 MB
name.basics.tsv.gzЛюди: имя, год рождения, известные тайтлы~700 MB

Загрузить их в Pandas довольно просто:

1ratings = pd.read_csv("title.ratings.tsv.gz", sep="\t", compression="gzip")
2basics = pd.read_csv("title.basics.tsv.gz", sep="\t", compression="gzip", low_memory=False)
3# Объединяем по tconst (IMDb title ID)
4merged = basics.merge(ratings, on="tconst")
5top_movies = merged[merged["titleType"] == "movie"].nlargest(250, "averageRating")

Эти датасеты охватывают 26+ миллионов тайтлов. Никакой пагинации, никаких селекторов, никаких 403. Лицензия — только для личного и некоммерческого использования: перепубликовывать или перепродавать данные нельзя.

No-code-обходной путь: Thunderbit сам обрабатывает пагинацию

Если вам нужны данные IMDb с пагинацией, но вы не хотите писать логику перелистывания, поддерживает и пагинацию по клику, и infinite scroll из коробки. Вы просто говорите ему, что нужно собрать, а остальное он делает сам — включая прокрутку lazy-loaded контента.

Парсинг IMDb на Python: полный рабочий код, готовый к копированию

Ниже — два полностью автономных скрипта, которые можно запускать прямо сейчас.

Скрипт A: метод BeautifulSoup (CSS-селекторы)

1import requests
2from bs4 import BeautifulSoup
3import pandas as pd
4> This paragraph contains content that cannot be parsed and has been skipped.
5response = requests.get(url, headers=headers)
6if response.status_code != 200:
7    print(f"Ошибка: {response.status_code}")
8    exit()
9soup = BeautifulSoup(response.text, "lxml")
10movie_items = soup.select("li.ipc-metadata-list-summary-item")
11movies = []
12for item in movie_items:
13    try:
14        title = item.select_one("h3.ipc-title__text")
15        year = item.select_one("span.cli-title-metadata-item")
16        rating = item.select_one("span.ipc-rating-star--rating")
17> This paragraph contains content that cannot be parsed and has been skipped.
18df = pd.DataFrame(movies)
19df.to_csv("imdb_top250_bs4.csv", index=False)
20print(f"Сохранено {len(df)} фильмов")
21print(df.head())

Скрипт B: метод JSON-LD (рекомендуется)

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5> This paragraph contains content that cannot be parsed and has been skipped.
6response = requests.get(url, headers=headers)
7if response.status_code != 200:
8    print(f"Ошибка: {response.status_code}")
9    exit()
10> This paragraph contains content that cannot be parsed and has been skipped.
11if not script_tag:
12    print("JSON-LD данные не найдены")
13    exit()
14data = json.loads(script_tag.string)
15movies = []
16for item in data.get("itemListElement", []):
17    movie = item.get("item", {})
18    rating_info = movie.get("aggregateRating", {})
19    directors = movie.get("director", [])
20    director_names = ", ".join(
21        d.get("name", "") for d in (directors if isinstance(directors, list) else [directors])
22    )
23> This paragraph contains content that cannot be parsed and has been skipped.
24df = pd.DataFrame(movies)
25df.to_csv("imdb_top250_jsonld.csv", index=False)
26print(f"Сохранено {len(df)} фильмов")
27print(df.head())

Оба скрипта включают обработку ошибок и сохраняют аккуратный CSV. Скрипт B даёт более богатые данные — режиссёра, описание, URL — и лучше переживает изменения интерфейса.

Как собрать данные IMDb без кода с помощью Thunderbit

Не всем нужно и не всем хочется писать Python. Возможно, вы аналитик операционной команды и вам просто нужна таблица с топовыми фильмами недели. Или контент-стратег, который хочет сравнить тренды жанров по годам. В таких случаях писать собственный скрейпер — это перебор.

Вот как получить те же данные через :

Перед началом:

  • Уровень сложности: новичок
  • Время: около 2 минут
  • Что понадобится: браузер Chrome, (бесплатного тарифа достаточно)

Шаг 1: откройте нужную страницу IMDb. Например, IMDb Top 250 или любой другой список/страницу поиска.

Шаг 2: нажмите "AI Suggest Fields" в боковой панели Thunderbit. AI просканирует страницу и предложит столбцы — обычно Title, Year, Rating, Genre и ещё несколько в зависимости от страницы. Вы увидите предпросмотр таблицы с рекомендуемыми полями.

Шаг 3: при необходимости подстройте поля. Удалите ненужные столбцы или добавьте свои через кнопку "+ Add Column", описав нужное поле обычным языком — например, "Director name" или "Number of votes".

Шаг 4: нажмите "Scrape". Thunderbit извлечёт данные. Если на странице есть infinite scroll или пагинация, он сам справится с прокруткой.

Шаг 5: экспортируйте. Нажмите кнопку экспорта и выберите формат — Excel, Google Sheets, CSV, Airtable или Notion. Данные окажутся в нужном месте за считанные секунды.

Главное преимущество здесь не только в удобстве — Thunderbit каждый раз заново читает структуру страницы с помощью AI. Когда IMDb меняет макет, AI подстраивается. Не нужно обновлять селекторы и чинить код. Для всех, кто хотя бы раз в 2 часа ночи перед дедлайном сталкивался со сломанным скрейпером, это бесценно.

Thunderbit также поддерживает парсинг подстраниц — вы можете перейти на страницу конкретного фильма и дополнить таблицу актёрами, режиссёром, длительностью и другими полями, которых нет в списке. Если хотите посмотреть, как это работает, загляните на .

Законно ли парсить IMDb? Что важно знать

Пользователи прямо спрашивают об этом на форумах: "Is something like this legal?… IMDb does not want people scraping their website." Это справедливый вопрос, и ни одна статья конкурентов его толком не разбирает.

robots.txt IMDb: страница Top 250 (/chart/top/), страницы отдельных тайтлов (/title/ttXXXXXXX/) и страницы имён (/name/nmXXXXXXX/) не заблокированы через robots.txt. Заблокированы пути вроде /find, /_json/*, /search/name-text, /user/ur*/ratings и различные AJAX-endpoint'ы. Директива Crawl-delay не указана.

Условия использования IMDb: релевантный пункт гласит: "You may not use data mining, robots, screen scraping, or similar data gathering and extraction tools on this site, except with our express written consent." Дополнительный пункт запрещает перепродажу или коммерческое использование собранных данных.

Что это значит на практике: недавние решения судов в 2024 году (Meta v. Bright Data, X Corp v. Bright Data) показали, что условия использования могут не связывать пользователей, которые с ними не соглашались — если вы собираете публично доступные данные без авторизации, исполнимость ToS остаётся спорной. Но область права здесь быстро меняется.

Безопасные альтернативы: официальные прямо разрешены для личного и некоммерческого использования. TMDb API тоже довольно лоялен и даёт бесплатный ключ. Оба варианта хороши, если хотите оставаться в максимально безопасной зоне.

Практический совет: если всё же скрапите, используйте умеренную скорость запросов (time.sleep(3) между запросами), задавайте корректные заголовки и не трогайте пути, которые запрещены в robots.txt. Для коммерческих проектов лучше проконсультироваться с юристом или использовать официальный датасет/API.

На блоге Thunderbit мы отдельно разобрали .

Вывод: выбирайте правильный способ парсить IMDb на Python

Коротко:

  • BeautifulSoup + CSS-селекторы: хороший способ выучить основы. Но ожидайте поломок каждые 6–12 месяцев. Обязательно добавляйте обработку ошибок.
  • Извлечение JSON-LD: подход, который я рекомендую для любого долгоживущего Python-проекта. Он следует стандарту Schema.org, меняется гораздо реже, чем CSS-классы, и даёт чистые структурированные данные без JavaScript-рендеринга.
  • JSON __NEXT_DATA__: используйте как дополнение для более богатых данных на страницах отдельных тайтлов — хронометража, полного состава, сюжета, постеров.
  • Официальные датасеты IMDb: лучший выбор для анализа больших объёмов. 26M+ тайтлов, ежедневные обновления, скрапинг не нужен. Только личное/некоммерческое использование.
  • : лучший вариант для тех, кто не пишет код, или для тех, кому нужны данные быстро и без поддержки скрипта. AI подстраивается под изменения интерфейса, обрабатывает пагинацию и экспортирует в Excel/Sheets/Airtable/Notion.

Сохраните это руководство в закладки — я обновлю его, когда структура IMDb снова изменится. А если хотите вообще обойтись без кода, и посмотрите, как быстро можно пройти путь от страницы IMDb до чистой таблицы. Если вы работаете и с другими сайтами, наш материал поможет выстроить более общий workflow.

Попробовать AI Web Scraper для IMDb и не только

FAQ

Законно ли парсить IMDb?

Условия использования IMDb запрещают scraping без согласия, но после недавних решений судов в 2024 году юридическая исполнимость ToS для публично доступных данных остаётся спорной. Самые безопасные варианты — официальные (личное/некоммерческое использование) или TMDb API (бесплатный ключ). Если вы всё же скрапите, соблюдайте robots.txt, делайте разумные паузы между запросами и не заходите на заблокированные пути. Для коммерческого использования стоит поговорить с юристом.

Почему мой IMDb-скрейпер возвращает пустые результаты?

Почти всегда причина в устаревших CSS-селекторах — классы вроде td.titleColumn и td.ratingColumn не используются с июня 2023 года. Решение: перейти на извлечение JSON-LD (парсить тег <script type="application/ld+json">) или обновить селекторы до актуальных классов с префиксом ipc-. Также проверьте, что вы отправляете корректный заголовок User-Agent, потому что его отсутствие вызывает 403-ошибку, которая может выглядеть как пустой результат.

Как собрать больше 25 результатов с IMDb?

Страница Top 250 загружает все 250 фильмов за один ответ — пагинация не нужна. Для результатов поиска используйте URL-параметр start= с шагом 50: например, start=1, start=51, start=101. Добавляйте time.sleep(3) между запросами, чтобы не получить блокировку. Либо используйте официальные датасеты IMDb на — там 26M+ тайтлов, и пагинация не требуется.

Что такое __NEXT_DATA__ и зачем он нужен для парсинга IMDb?

__NEXT_DATA__ — это JSON-объект, встроенный в тег <script id="__NEXT_DATA__"> на страницах IMDb, построенных на React/Next.js. Он содержит полные структурированные данные, которые React использует для отрисовки страницы: названия, рейтинги, актёров, жанры, длительность и многое другое. Поскольку он отражает не визуальную верстку, а саму модель данных, он устойчивее к редизайнам интерфейса, чем CSS-селекторы. Используйте его вместе с JSON-LD для максимально надёжного извлечения данных.

Можно ли парсить IMDb без кода?

Да. Есть два основных варианта: (1) скачать официальные bulk-датасеты IMDb — 7 TSV-файлов, покрывающих 26M+ тайтлов, с ежедневными обновлениями и бесплатных для некоммерческого использования. (2) Использовать , который читает страницу IMDb, автоматически предлагает поля для извлечения и за два клика экспортирует данные в Excel, Google Sheets или CSV — без кода и без необходимости поддерживать селекторы.

Подробнее

Ke
Ke
CTO @ Thunderbit. Ke is the person everyone pings when data gets messy. He's spent his career turning tedious, repetitive work into quiet little automations that just run. If you've ever wished a spreadsheet could fill itself in, Ke has probably already built the thing that does it.
Содержание

Попробуй Thunderbit

Собирай лиды и другие данные всего за 2 клика. На базе ИИ.

Получить Thunderbit Это бесплатно
Извлекай данные с помощью ИИ
Легко передавай данные в Google Sheets, Airtable или Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week