Если вы недавно искали, как "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/Excellxml— быстрый 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 описывает реальные данные, а не то, как они отрисованы на странице. Это примерно как разница между оглавлением книги и попыткой понять главы по размеру шрифта.

Пошагово: извлекаем данные 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.
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 — без кода и без необходимости поддерживать селекторы.
Подробнее
