Scrape IMDb za pomocą Pythona: kod, który naprawdę działa

Ostatnia aktualizacja: April 28, 2026

Jeśli ostatnio szukałeś hasła „scrape IMDb with Python”, pewnie zauważyłeś jedną rzecz: większość znalezionych poradników jest po prostu zepsuta. Nie w sensie „trochę nieaktualna” — raczej „zwraca zero wyników i ścianę błędów NoneType” zepsuta.

Przez ostatnie kilka tygodni testowałem każdy większy poradnik o scrapowaniu IMDb, jaki udało mi się znaleźć — GeeksforGeeks, Medium, freeCodeCamp, notebooki Kaggle, wszystko. Spośród oznaczonych pod scrapowanie IMDb zdecydowana większość odwołuje się do selektorów CSS (td.titleColumn, td.ratingColumn), które nie istnieją od czerwca 2023, kiedy IMDb przeprojektowało stronę Top 250. Efekt? Fora pełne programistów pytających „dlaczego mój kod zwraca pusto?”, a opiekunowie popularnych bibliotek, takich jak : „Niewiele możemy z tym zrobić poza naprawieniem każdego parsera”. Ten przewodnik omawia dwie metody w Pythonie, które naprawdę działają już teraz, pokazuje, jak obsłużyć paginację i typowe błędy, kiedy Python w ogóle nie jest właściwym narzędziem, oraz jak zabezpieczyć scraper na przyszłość, żeby nie skończył na technicznym cmentarzysku.

Co to znaczy scrapować IMDb za pomocą Pythona?

Web scraping to proces programowego pobierania danych ze stron internetowych — zamiast ręcznie kopiować i wklejać, piszesz skrypt, który robi to za Ciebie. Gdy mówimy o „scrapowaniu IMDb”, chodzi o pobieranie uporządkowanych danych o filmach (tytułów, ocen, gatunków, obsady, czasu trwania, liczby głosów) ze stron IMDb przy użyciu Pythona.

Typowy stos Pythona do tego celu obejmuje trzy biblioteki: requests (do pobrania strony), BeautifulSoup (do parsowania HTML i wyszukiwania danych) oraz pandas (do porządkowania i eksportu wyników). Niektóre poradniki używają też Selenium albo Playwright do stron wymagających renderowania JavaScript, ale jak zaraz zobaczysz, istnieją szybsze podejścia.

Ważne zastrzeżenie: wszystko w tym przewodniku zostało zweryfikowane względem aktualnej struktury stron IMDb na połowę 2025 roku. IMDb zmienia układ mniej więcej co 6–12 miesięcy, więc jeśli czytasz to w 2027 roku, niektóre selektory mogły się już przesunąć. (Wyjaśnię też, jak sobie z tym poradzić.)

Dlaczego warto scrapować IMDb za pomocą Pythona? Praktyczne zastosowania

Zanim napiszesz choćby jedną linię kodu, zastanów się: co właściwie chcesz zrobić z danymi z IMDb? Odpowiedź zależy od tego, kim jesteś.

Zbiór recenzji IMDb jest jednym z najczęściej używanych benchmarków NLP na świecie — przełomowa praca Maas i in. (2011) zebrała , a sam zestaw danych jest wbudowany w TensorFlow, Keras i PyTorch. Na Hugging Face zbiór stanfordnlp/imdb ma 213 321 pobrań miesięcznie i posłużył do trenowania ponad 1 500 modeli. Jeśli więc zajmujesz się machine learningiem, prawdopodobnie już znasz dane IMDb.

Ale zastosowania wykraczają daleko poza akademię:

ZastosowanieDla kogoPotrzebne pola danych
Silnik rekomendacji filmówAnalitycy danych, pasjonaciTytuły, gatunki, oceny, obsada
Strategia treści dla platform streamingowychZespoły produktowe i contentoweOceny, głosy, rok premiery, gatunki
Analiza sentymentu / trening NLPBadacze ML, studenciRecenzje, oceny
Analiza konkurencyjnych treściAnalitycy branży rozrywkowejBox office, daty premier, trendy ocen
Badania filmowej turystykiOrganizacje turystyczne, firmy podróżniczeLokacje zdjęciowe, metryki popularności
Badania akademickieNaukowcy uniwersyteccyDowolne uporządkowane metadane filmowe

Sam rynek turystyki filmowej jest wart szacunkowo . Netflix wydał w 2024 roku ponad 17 miliardów dolarów na treści, a napędzały spersonalizowane rekomendacje. Chodzi o to, że dane IMDb wspierają realne decyzje w wielu branżach.

Twoje opcje pozyskania danych z IMDb, zanim napiszesz choćby linię kodu

To sekcja, którą większość poradników pomija całkowicie. Przeskakują od razu do pip install beautifulsoup4, nie zadając pytania, czy scrapowanie w Pythonie w ogóle jest dla Ciebie najlepszym rozwiązaniem.

Oto pełen obraz:

ŚcieżkaNajlepsza dlaZaletyWady
Python + BeautifulSoupNauka, własne ekstrakcjePełna kontrola, elastycznośćKruche selektory, częste awarie
Ekstrakcja JSON-LD / __NEXT_DATA__Deweloperzy, którzy chcą stabilnościObsługuje treści JS, większa odpornośćWymaga zrozumienia struktury JSON
Oficjalne zbiory danych IMDbAnalizy na dużą skalę, zastosowania akademickieLegalne, kompletne, 26M+ tytułów, codzienne aktualizacjeFormat TSV, brak recenzji/obrazów
Biblioteka Cinemagoer (IMDbPY)Programowe wyszukiwanie pojedynczych tytułówAPI w stylu Pythona, bogate pola88 otwartych zgłoszeń, ostatnie wydanie w maju 2023
TMDb APIMetadane filmowe + obrazyDarmowy klucz API, JSON, dobra dokumentacjaInne źródło (nie oceny IMDb)
Thunderbit (no-code)Osoby nietechniczne, szybki eksportScrapowanie w 2 kliknięcia, AI proponuje pola, eksport do Excela/SheetsPrzy dużych scrapach działa na kredyty

Kilka uwag o tych opcjach. Cinemagoer nie miał wydania na PyPI od maja 2023, a większość jego parserów przestała działać po redesignie IMDb z czerwca 2025 — dziś nie polecałbym go do produkcji. TMDb jest świetne, ale korzysta z własnego systemu ocen, a nie IMDb. Z kolei oficjalne API enterprise IMDb kosztuje przez AWS Data Exchange, więc dla większości z nas to nie jest realna opcja.

Dla czytelników, którzy w ogóle nie chcą pisać kodu, odczytuje stronę IMDb, automatycznie sugeruje pola do pobrania (tytuł, ocena, rok, gatunek) i eksportuje dane do Excela, Google Sheets, Airtable lub Notion w dwa kliknięcia. AI dostosowuje się, gdy IMDb zmienia układ strony, więc nie trzeba utrzymywać selektorów. Wrócę do tego później.

A teraz — dla tych, którzy chcą pisać w Pythonie — oto dwie działające metody.

Metoda 1: scrapowanie IMDb w Pythonie z użyciem BeautifulSoup (podejście tradycyjne)

To klasyczne podejście, które znajdziesz w większości poradników. Działa, ale powiem wprost: jest najbardziej podatne na awarie spośród metod omawianych w tym tekście. Klasy CSS IMDb są generowane automatycznie i zmieniają się przy redesignach. Mimo to to najlepszy sposób, by nauczyć się podstaw web scrapingu.

Krok 1: zainstaluj i zaimportuj biblioteki Pythona

Potrzebujesz czterech pakietów:

1pip install requests beautifulsoup4 pandas lxml

Do czego służy każdy z nich:

  • requests — wysyła żądania HTTP, aby pobrać stronę
  • beautifulsoup4 — parsuje HTML, dzięki czemu możesz wyszukiwać konkretne elementy
  • pandas — porządkuje wyodrębnione dane w tabelach i eksportuje je do CSV/Excela
  • lxml — szybki parser HTML (BeautifulSoup może używać go jako silnika)

Blok importu:

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

Krok 2: wyślij żądanie HTTP do IMDb

To miejsce, w którym większość początkujących po raz pierwszy się zatrzymuje. IMDb blokuje żądania bez odpowiedniego nagłówka User-Agent — dostaniesz błąd 403 Forbidden. Domyślny ciąg user-agent w Python Requests (python-requests/2.31.0) jest od razu oznaczany.

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"Nie udało się pobrać strony: {response.status_code}")
9else:
10    print("Strona pobrana pomyślnie")

Nagłówek Accept-Language też ma znaczenie — bez niego IMDb może zwrócić treść w innym języku zależnie od geolokalizacji Twojego IP.

Krok 3: sparsuj HTML za pomocą BeautifulSoup

Gdy masz już HTML, utwórz obiekt BeautifulSoup i zacznij wyszukiwać właściwe elementy. Otwórz stronę IMDb Top 250 w Chrome, kliknij prawym przyciskiem na tytuł filmu i wybierz „Inspect”, żeby zobaczyć wewnętrzną strukturę HTML.

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

Na połowę 2025 roku strona Top 250 używa tych selektorów:

  • Kontener filmu: li.ipc-metadata-list-summary-item
  • Tytuł: h3.ipc-title__text
  • Rok: span.cli-title-metadata-item (pierwszy span)
  • Ocena: span.ipc-rating-star--rating

Uwaga: klasy z prefiksem ipc- są generowane przez system komponentów IMDb. Od redesignu z czerwca 2023 pozostają stabilne, ale nie ma gwarancji, że nie zmienią się ponownie.

Krok 4: wyodrębnij dane filmu (tytuł, rok, ocena)

Tu różnię się od większości poradników: uwzględniam obsługę błędów try/except. Żaden z analizowanych przeze mnie konkurencyjnych przewodników tego nie robi, dlatego ich kod po cichu się wysypuje, gdy zmieni się selektor.

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        movies.append({
12            "title": title,
13            "year": year,
14            "rating": rating
15        })
16    except Exception as e:
17        print(f"Błąd podczas parsowania filmu: {e}")
18        continue
19print(f"Wyodrębniono {len(movies)} filmów")

Krok 5: zapisz do CSV lub Excela z użyciem 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())

Przykładowy wynik:

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

To działa. Ale opiera się na selektorach CSS, które mogą się zepsuć każdego dnia — i to prowadzi nas do podejścia, które naprawdę polecam.

Metoda 2: trik z JSON-LD — bez parsowania HTML

To technika, której żaden konkurencyjny artykuł nie omawia, a ja użyłbym jej w każdym poważnym projekcie. IMDb osadza dane strukturalne jako (JavaScript Object Notation for Linked Data) w tagach <script type="application/ld+json"> na każdej stronie. Dane te są zgodne ze standardem Schema.org, wykorzystywanym przez Google do wyników rozszerzonych, i zmieniają się znacznie rzadziej niż klasy CSS.

Apify IMDb Scraper, narzędzie klasy produkcyjnej, stosuje priorytet ekstrakcji: „JSON-LD > NEXT_DATA > DOM”. To hierarchia, którą również polecam.

Dlaczego JSON-LD jest bardziej niezawodny niż selektory CSS

PodejścieObsługuje treści JS?Odporne na zmiany UI?SzybkośćZłożoność
BeautifulSoup + selektory CSS❌ Nie⚠️ Kruche (nazwy klas się zmieniają)SzybkieNiska
Ekstrakcja JSON-LD✅ Tak✅ Zgodne ze standardem Schema.orgSzybkieNiska-średnia
Ekstrakcja JSON z __NEXT_DATA__✅ Tak✅ Dość stabilneSzybkieNiska-średnia
Selenium / Playwright✅ Tak⚠️ KrucheWolneŚrednia-wysoka
Thunderbit (no-code, 2 kliknięcia)✅ Tak (AI odczytuje stronę)✅ AI dostosowuje się automatycznieSzybkieBrak

Klasy CSS, takie jak ipc-metadata-list-summary-item, są generowane automatycznie przez system komponentów React IMDb i zmieniają się przy każdym redesignie. Schema JSON-LD reprezentuje rzeczywisty model danych, a nie warstwę wizualną. To jak różnica między czytaniem spisu treści książki a próbą rozpoznania rozdziałów po rozmiarze czcionki.

css-selectors-vs-json-ld.webp

Krok po kroku: wyodrębnianie danych IMDb z JSON-LD

Krok 1: pobierz stronę

Tak samo jak wcześniej — użyj requests z odpowiednim nagłówkiem User-Agent.

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5url = "https://www.imdb.com/chart/top/"
6headers = {
7    "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",
8    "Accept-Language": "en-US,en;q=0.9"
9}
10response = requests.get(url, headers=headers)
11soup = BeautifulSoup(response.text, "lxml")

Krok 2: znajdź tag skryptu JSON-LD

1script_tag = soup.find("script", {"type": "application/ld+json"})
2if not script_tag:
3    print("Na tej stronie nie znaleziono JSON-LD")
4else:
5    data = json.loads(script_tag.string)
6    print(f"Znaleziono JSON-LD typu: {data.get('@type', 'nieznany')}")

Krok 3: sparsuj dane strukturalne

Na stronie Top 250 JSON-LD zawiera tablicę itemListElement ze wszystkimi 250 filmami. Każdy wpis zawiera pozycję, nazwę, URL, aggregateRating, datePublished, gatunek, opis, reżysera i tablice aktorów.

1movies = []
2for item in data.get("itemListElement", []):
3    movie = item.get("item", {})
4    rating_info = movie.get("aggregateRating", {})
5    movies.append({
6        "rank": item.get("position"),
7        "title": movie.get("name"),
8        "url": movie.get("url"),
9        "rating": rating_info.get("ratingValue"),
10        "vote_count": rating_info.get("ratingCount"),
11        "date_published": movie.get("datePublished"),
12        "genre": ", ".join(movie.get("genre", [])),
13        "description": movie.get("description"),
14    })

Krok 4: eksportuj do CSV

1df = pd.DataFrame(movies)
2df.to_csv("imdb_top_250_json_ld.csv", index=False)
3print(df.head())

Przykładowy wynik:

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

Wszystkie 250 filmów. Czysto, uporządkowanie, bez gimnastyki z selektorami CSS. A ponieważ te dane są zgodne ze standardem Schema.org, na którym opiera się Google przy wynikach wyszukiwania, dużo rzadziej się zmieniają niż warstwa wizualna.

Dodatkowo: __NEXT_DATA__ dla stron pojedynczych filmów

W przypadku bogatszych danych ze stron pojedynczych tytułów (czas trwania, pełna obsada, opis fabuły, plakaty) IMDb osadza też obiekt JSON __NEXT_DATA__. To dane, których React używa do „dostarczenia” strony — nie da się ich usunąć bez zepsucia serwisu.

1# Na stronie pojedynczego filmu, np. /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"]

Używaj JSON-LD dla stron list i zestawień, a __NEXT_DATA__ dla pojedynczych stron tytułów. To podejście klasy produkcyjnej.

Dlaczego Twój scraper IMDb ciągle się psuje i jak to naprawić

To najczęściej zgłaszany problem we wszystkich forach o scrapowaniu IMDb, które sprawdziłem. Użytkownicy piszą: „Niektóry kod przestał działać przez zmiany w UI” i „Nie działa w 2024!” — a odpowiedzią zwykle jest cisza albo „spróbuj Selenium”.

Główna przyczyna to ciągła migracja IMDb do frontendu React/Next.js. Oto oś czasu najważniejszych zmian, które łamały scrapery:

DataCo się zmieniłoCo się zepsuło
Lis 2022Przeprojektowano strony nazwiskStare scrapery stron nazwisk
Czer 2023Przeprojektowano stronę Top 250Wszystkie selektory td.titleColumn / td.ratingColumn
Kwi 2023Przeprojektowano podstrony tytułówScrapery bio, nagród, wiadomości
Paź 2023Przeprojektowano Advanced SearchScrapery oparte na wyszukiwaniu
Czer 2025Przeprojektowano strony /referenceBiblioteka Cinemagoer (większość parserów)

To mniej więcej jedna większa zmiana łamiąca wszystko co 6–12 miesięcy. Jeśli Twój scraper opiera się na nazwach klas CSS, jedziesz na bieżni.

Typowe błędy i jak je naprawić

Puste wyniki / błędy NoneType

Najczęstszy błąd. Zobaczysz AttributeError: 'NoneType' object has no attribute 'text'. Oznacza to, że BeautifulSoup nie znalazł szukanego elementu — zwykle dlatego, że zmieniła się nazwa klasy CSS albo treść jest renderowana przez JavaScript.

Naprawa: przejdź na ekstrakcję JSON-LD (Metoda 2 powyżej). Dane są w początkowej odpowiedzi HTML, bez potrzeby uruchamiania JavaScript.

403 Forbidden

IMDb używa do wykrywania i blokowania botów. Najczęstszym wyzwalaczem jest brak nagłówka User-Agent albo jego oczywiście fałszywa wartość. Potwierdzają to projekty open source oraz , gdzie pracownik IMDb przyznał, że problem istnieje.

Naprawa: zawsze dodawaj realistyczny nagłówek User-Agent przeglądarki i Accept-Language: en-US. Używaj requests.Session() do poolingu połączeń.

Zwracane są tylko 25 wyników

Strony wyników wyszukiwania IMDb i listy „Most Popular” korzystają z leniwego ładowania — początkowo renderują tylko około 25 wyników, a kolejne dociągają przez AJAX podczas przewijania.

Naprawa: użyj paginacji przez parametr URL (omówione w następnej sekcji) albo przejdź na stronę Top 250, która ładuje wszystkie 250 filmów w jednej odpowiedzi.

Selektory nagle przestają działać

Stare selektory, które już nie działają: td.titleColumn, td.ratingColumn, .lister-item-header, .inline-block.ratings-imdb-rating. Jeśli Twój kod używa któregokolwiek z nich, jest uszkodzony.

Naprawa: preferuj atrybuty data-testid (np. h1[data-testid="hero-title-block__title"]) zamiast automatycznie generowanych klas. Jeszcze lepiej — używaj JSON-LD.

Ramy decyzyjne: poprawki krótkoterminowe vs długoterminowe

  • Szybka poprawka: dodaj bloki try/except wokół każdego selektora, sprawdzaj status HTTP, loguj błędy zamiast przerywać działanie
  • Średnioterminowa poprawka: przejdź z selektorów CSS na ekstrakcję JSON-LD (Metoda 2)
  • Długoterminowa poprawka: używaj do analizy na dużą skalę albo narzędzia takiego jak , które używa AI do ponownego odczytu struktury strony za każdym razem — bez selektorów do utrzymywania, AI automatycznie dopasowuje się do zmian układu

Poza barierą 25 wyników: scrapowanie paginacji IMDb i dużych zbiorów danych

Każdy konkurencyjny poradnik, który sprawdziłem, scrapuje dokładnie jedną stronę. Nikt nie opisuje paginacji. A jeśli potrzebujesz więcej niż jednej listy, szybko trafisz na ograniczenia.

Strony, które nie wymagają paginacji

Dobra wiadomość: strona Top 250 ładuje wszystkie 250 filmów w jednej odpowiedzi renderowanej po stronie serwera. Zarówno JSON-LD, jak i __NEXT_DATA__ zawierają pełny zestaw danych. Paginacja nie jest potrzebna.

Jak działa paginacja wyszukiwania IMDb

Strony wyszukiwania IMDb używają parametru URL start=, zwiększanego co 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

Oto pętla w Pythonie, która przechodzi przez wyniki strona po stronie:

1import time
2all_movies = []
3for start in range(1, 1001, 50):  # Przechodzi przez 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"Błąd przy start={start}: {response.status_code}")
8        break
9    soup = BeautifulSoup(response.text, "lxml")
10    # Wyodrębnij filmy wybraną metodą
11    # ...
12    print(f"Zeskrobano stronę zaczynającą się od {start}")
13    time.sleep(3)  # Zachowaj kulturę — IMDb blokuje po ok. 50 szybkich żądaniach

To time.sleep(3) ma znaczenie. Zgłoszenia ze społeczności sugerują, że IMDb zaczyna blokować adresy IP po około 50 szybkich żądaniach. Losowe opóźnienie między 2 a 5 sekundami to dobra praktyka.

Kiedy całkiem pominąć scrapowanie: oficjalne bulk datasets IMDb

Jeśli potrzebujesz naprawdę dużej skali, IMDb udostępnia 7 darmowych plików TSV na , odświeżanych codziennie:

PlikZawartośćRozmiar
title.basics.tsv.gzTytuły, typy, gatunki, czas trwania, rok~800 MB
title.ratings.tsv.gzŚrednia ocena, liczba głosów~25 MB
title.crew.tsv.gzReżyserzy, scenarzyści~300 MB
title.principals.tsv.gzGłówna obsada / ekipa~2 GB
title.akas.tsv.gzAlternatywne tytuły według regionu~1,5 GB
title.episode.tsv.gzInformacje o odcinkach TV~200 MB
name.basics.tsv.gzOsoby: imię, rok urodzenia, znane tytuły~700 MB

Załadowanie ich do Pandas jest proste:

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# Łączenie po tconst (ID tytułu IMDb)
4merged = basics.merge(ratings, on="tconst")
5top_movies = merged[merged["titleType"] == "movie"].nlargest(250, "averageRating")

Te zbiory obejmują ponad 26 milionów tytułów. Bez paginacji, bez selektorów, bez błędów 403. Licencja dotyczy wyłącznie użytku osobistego i niekomercyjnego — nie możesz publikować ani odsprzedawać tych danych.

Skrót bez kodu: Thunderbit obsługuje paginację za Ciebie

Dla czytelników, którzy potrzebują danych IMDb z paginacją, ale nie chcą pisać logiki paginacji, natywnie obsługuje zarówno paginację kliknięciami, jak i infinite scroll. Mówisz mu, co ma zeskrobać, a on zajmuje się resztą — łącznie z przewijaniem treści ładowanej leniwie.

Scrape IMDb za pomocą Pythona: pełny działający kod gotowy do skopiowania

Poniżej znajdziesz dwa samodzielne skrypty, które możesz uruchomić od razu.

Skrypt A: metoda BeautifulSoup (selektory CSS)

1import requests
2from bs4 import BeautifulSoup
3import pandas as pd
4url = "https://www.imdb.com/chart/top/"
5headers = {
6    "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",
7    "Accept-Language": "en-US,en;q=0.9"
8}
9response = requests.get(url, headers=headers)
10if response.status_code != 200:
11    print(f"Błąd: {response.status_code}")
12    exit()
13soup = BeautifulSoup(response.text, "lxml")
14movie_items = soup.select("li.ipc-metadata-list-summary-item")
15movies = []
16for item in movie_items:
17    try:
18        title = item.select_one("h3.ipc-title__text")
19        year = item.select_one("span.cli-title-metadata-item")
20        rating = item.select_one("span.ipc-rating-star--rating")
21        movies.append({
22            "title": title.text.strip() if title else "N/A",
23            "year": year.text.strip() if year else "N/A",
24            "rating": rating.text.strip() if rating else "N/A",
25        })
26    except Exception as e:
27        print(f"Pomijam film z powodu błędu: {e}")
28df = pd.DataFrame(movies)
29df.to_csv("imdb_top250_bs4.csv", index=False)
30print(f"Zapisano {len(df)} filmów")
31print(df.head())

Skrypt B: metoda JSON-LD (zalecana)

1import requests
2from bs4 import BeautifulSoup
3import json
4import pandas as pd
5url = "https://www.imdb.com/chart/top/"
6headers = {
7    "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",
8    "Accept-Language": "en-US,en;q=0.9"
9}
10response = requests.get(url, headers=headers)
11if response.status_code != 200:
12    print(f"Błąd: {response.status_code}")
13    exit()
14soup = BeautifulSoup(response.text, "lxml")
15script_tag = soup.find("script", {"type": "application/ld+json"})
16if not script_tag:
17    print("Nie znaleziono danych JSON-LD")
18    exit()
19data = json.loads(script_tag.string)
20movies = []
21for item in data.get("itemListElement", []):
22    movie = item.get("item", {})
23    rating_info = movie.get("aggregateRating", {})
24    directors = movie.get("director", [])
25    director_names = ", ".join(
26        d.get("name", "") for d in (directors if isinstance(directors, list) else [directors])
27    )
28    movies.append({
29        "rank": item.get("position"),
30        "title": movie.get("name"),
31        "url": movie.get("url"),
32        "rating": rating_info.get("ratingValue"),
33        "votes": rating_info.get("ratingCount"),
34        "year": movie.get("datePublished", "")[:4],
35        "genre": ", ".join(movie.get("genre", [])),
36        "director": director_names,
37        "description": movie.get("description"),
38    })
39df = pd.DataFrame(movies)
40df.to_csv("imdb_top250_jsonld.csv", index=False)
41print(f"Zapisano {len(df)} filmów")
42print(df.head())

Oba skrypty zawierają obsługę błędów i generują czysty plik CSV. Skrypt B daje bogatsze dane — reżysera, opis, URL — i jest odporniejszy na zmiany układu strony.

Jak scrapować IMDb bez pisania kodu (z Thunderbit)

Nie każdy potrzebuje lub chce pisać w Pythonie. Może jesteś analitykiem operacyjnym i potrzebujesz tylko listy najlepiej ocenianych filmów z tego tygodnia w arkuszu. Może jesteś strategiem treści i chcesz porównać trendy gatunkowe w różnych latach. W takich przypadkach pisanie scrapera to przerost formy nad treścią.

Oto jak pobrać te same dane z użyciem :

Zanim zaczniesz:

  • Poziom trudności: początkujący
  • Czas potrzebny: około 2 minut
  • Czego potrzebujesz: przeglądarka Chrome, (darmowy plan wystarczy)

Krok 1: przejdź do strony IMDb, którą chcesz zeskrobać. Otwórz IMDb Top 250 (lub dowolną inną listę / stronę wyszukiwania IMDb) w Chrome.

Krok 2: kliknij „AI Suggest Fields” na pasku bocznym Thunderbit. AI skanuje stronę i proponuje kolumny — zwykle Tytuł, Rok, Ocena, Gatunek i kilka innych, zależnie od strony. Zobaczysz podgląd tabeli z sugerowanymi polami.

Krok 3: dostosuj pola, jeśli trzeba. Usuń kolumny, których nie potrzebujesz, albo dodaj własne, klikając „+ Add Column” i opisując po prostu, czego chcesz (np. „nazwa reżysera” albo „liczba głosów”).

Krok 4: kliknij „Scrape”. Thunderbit pobierze dane. W przypadku stron z infinite scroll lub paginacją obsłuży przewijanie automatycznie.

Krok 5: eksportuj. Kliknij przycisk eksportu i wybierz format — Excel, Google Sheets, CSV, Airtable albo Notion. Dane trafią do docelowego miejsca w kilka sekund.

Kluczową zaletą nie jest tylko wygoda — Thunderbit AI za każdym razem odczytuje strukturę strony od nowa. Gdy IMDb zmieni układ (a zmieni), AI się dostosuje. Bez aktualizowania selektorów, bez poprawiania kodu. Dla każdego, kto kiedyś został ugryziony przez zepsutego scrapera o 2:00 w nocy przed deadlinem, to bezcenne.

Thunderbit obsługuje też scrapowanie podstron — możesz wejść w szczegóły każdego filmu i wzbogacić tabelę o obsadę, reżysera, czas trwania oraz inne pola, których nie widać na stronie listy. Jeśli chcesz zobaczyć to w akcji, sprawdź .

Czy scrapowanie IMDb jest legalne? Co warto wiedzieć

Użytkownicy wprost pytają o to na forach: „Czy coś takiego jest legalne?… IMDb nie chce, żeby ludzie scrapowali ich stronę.” To uczciwe pytanie, a żaden konkurencyjny artykuł go nie omawia.

robots.txt IMDb: wykres Top 250 (/chart/top/), pojedyncze strony tytułów (/title/ttXXXXXXX/) oraz strony nazwisk (/name/nmXXXXXXX/) NIE są blokowane przez robots.txt. Zablokowane ścieżki obejmują /find, /_json/*, /search/name-text, /user/ur*/ratings oraz różne endpointy AJAX. Nie ma też wskazanej dyrektywy Crawl-delay.

Warunki korzystania z IMDb: odpowiednia klauzula brzmi: „Nie wolno używać data mining, robotów, screen scrapingu ani podobnych narzędzi do pozyskiwania i ekstrakcji danych na tej stronie, chyba że wyrazimy na to pisemną zgodę.” Dodatkowa klauzula zabrania odsprzedaży lub komercyjnego wykorzystania zeskrobanych danych.

Co to oznacza w praktyce: niedawne wyroki sądowe z 2024 roku (Meta v. Bright Data, X Corp v. Bright Data) uznały, że regulamin może nie wiązać użytkowników, którzy nigdy go nie zaakceptowali — jeśli scrapujesz publicznie dostępne dane bez logowania, egzekwowalność ToS jest dyskusyjna. To jednak nadal rozwijający się obszar prawa.

Bezpieczne alternatywy: oficjalne są wyraźnie dopuszczone do użytku osobistego i niekomercyjnego. API TMDb jest przyjazne i ma darmowy klucz API. Obie opcje są solidne, jeśli chcesz działać bezpiecznie.

Praktyczna wskazówka: jeśli jednak scrapujesz, stosuj rozsądne tempo (time.sleep(3) między żądaniami), ustaw poprawne nagłówki i nie uderzaj w ścieżki zablokowane przez robots.txt. W projektach komercyjnych skonsultuj się z prawnikiem lub użyj oficjalnych zbiorów danych/API.

Szczegółowo omówiliśmy na blogu Thunderbit.

Podsumowanie: wybierz właściwy sposób scrapowania IMDb w Pythonie

Krótka wersja:

  • BeautifulSoup + selektory CSS: dobre do nauki podstaw. Spodziewaj się, że będzie się psuć co 6–12 miesięcy. Zawsze dodawaj obsługę błędów.
  • Ekstrakcja JSON-LD: podejście, które polecam do każdego trwalszego projektu Pythona. Zgodne ze standardem Schema.org, zmienia się dużo rzadziej niż klasy CSS i daje czyste, uporządkowane dane bez renderowania JavaScript.
  • JSON __NEXT_DATA__: używaj jako uzupełnienia dla bogatszych danych na stronach pojedynczych tytułów (czas trwania, pełna obsada, fabuła, plakaty).
  • Oficjalne zbiory danych IMDb: najlepszy wybór do analiz na dużą skalę. 26M+ tytułów, codzienne aktualizacje, bez potrzeby scrapowania. Tylko użytek osobisty / niekomercyjny.
  • : najlepszy wybór dla osób nietechnicznych lub każdego, kto chce szybko dostać dane bez utrzymywania kodu. AI dostosowuje się do zmian układu, obsługuje paginację, eksportuje do Excela/Sheets/Airtable/Notion.

Dodaj ten przewodnik do zakładek — zaktualizuję go, gdy następnym razem zmieni się struktura IMDb. A jeśli chcesz całkiem pominąć kod, i zobacz, jak szybko przejdziesz od strony IMDb do czystego arkusza. Jeśli pracujesz też z innymi stronami, nasz poradnik o opisuje szerszy proces pracy.

Wypróbuj AI Web Scraper do IMDb i nie tylko

FAQ

Czy scrapowanie IMDb jest legalne?

Warunki korzystania z IMDb zabraniają scrapowania bez zgody, ale egzekwowalność ToS wobec publicznie dostępnych danych po niedawnych wyrokach z 2024 roku jest prawnie dyskusyjna. Najbezpieczniejsze opcje to oficjalne (użytek osobisty / niekomercyjny) albo API TMDb (darmowy klucz). Jeśli jednak scrapujesz, respektuj robots.txt, stosuj rozsądne opóźnienia między żądaniami i unikaj zablokowanych ścieżek. W przypadku użytku komercyjnego skonsultuj się z prawnikiem.

Dlaczego mój scraper IMDb zwraca puste wyniki?

Prawie zawsze winne są nieaktualne selektory CSS — klasy takie jak td.titleColumn i td.ratingColumn nie istnieją od czerwca 2023. Rozwiązaniem jest przejście na ekstrakcję JSON-LD (parsowanie tagu <script type="application/ld+json">) albo aktualizacja selektorów do obecnych klas z prefiksem ipc-. Sprawdź też, czy wysyłasz poprawny nagłówek User-Agent, bo jego brak wywołuje błąd 403, który może wyglądać jak puste wyniki.

Jak zeskrobać więcej niż 25 wyników z IMDb?

Strona Top 250 ładuje wszystkie 250 filmów w jednej odpowiedzi — bez potrzeby paginacji. W przypadku wyników wyszukiwania użyj parametru URL start= (zwiększanego co 50), aby przechodzić między stronami. Na przykład: start=1, start=51, start=101. Dodaj time.sleep(3) między żądaniami, by uniknąć blokady. Alternatywnie oficjalne zbiory danych IMDb na zawierają ponad 26 milionów tytułów i nie wymagają paginacji.

Czym jest __NEXT_DATA__ i dlaczego warto go używać do scrapowania IMDb?

__NEXT_DATA__ to obiekt JSON osadzony w tagu <script id="__NEXT_DATA__"> na stronach IMDb opartych na React/Next.js. Zawiera pełne dane strukturalne używane przez React do renderowania strony — tytuły, oceny, obsadę, gatunki, czas trwania i wiele więcej. Ponieważ reprezentuje bazowy model danych, a nie układ wizualny, jest bardziej odporny na redesign UI niż selektory CSS. Najlepiej używać go razem z JSON-LD.

Czy mogę scrapować IMDb bez kodowania?

Tak. Dwie główne opcje: (1) pobierz oficjalne — 7 plików TSV obejmujących 26M+ tytułów, codziennie aktualizowanych, darmowych do użytku niekomercyjnego. (2) Użyj , który odczytuje stronę IMDb, automatycznie sugeruje pola do pobrania i eksportuje dane do Excela, Google Sheets lub CSV w dwa kliknięcia — bez kodu i bez utrzymywania selektorów.

Dowiedz się więcej

Ke
Ke
CTO @ Thunderbit. Ke to osoba, do której wszyscy piszą, gdy dane robią się chaotyczne. Całą swoją karierę spędził na zamienianiu żmudnej, powtarzalnej pracy w ciche, małe automatyzacje, które po prostu działają. Jeśli kiedykolwiek marzyłeś, żeby arkusz kalkulacyjny sam się wypełniał, Ke prawdopodobnie już zbudował narzędzie, które to robi.
Spis treści

Wypróbuj Thunderbit

Pobieraj leady i inne dane w zaledwie 2 kliknięcia. Napędzane przez AI.

Pobierz Thunderbit To za darmo
Wyciągaj dane z pomocą AI
Łatwo przenieś dane do Google Sheets, Airtable lub Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week