IMDb:n kaavinta Pythonilla: koodi, joka oikeasti toimii

Viimeksi päivitetty April 28, 2026

Jos olet hiljattain hakenut fraasia "scrape IMDb with Python", olet varmasti huomannut yhden asian: useimmat löytyvät ohjeet ovat rikki. Eivät vain "hieman vanhentuneita", vaan enemmänkin sellaista tasoa, että ne tuottavat nollatuloksen ja seinän täydeltä NoneType-virheitä.

Olen käyttänyt viimeiset viikot testaten käytännössä jokaista merkittävää IMDb-kaavintaohjetta, jonka löysin — GeeksforGeeks, Medium, freeCodeCamp, Kaggle-notebookit, you name it. Yli , jotka on merkitty IMDb-kaavintaan, valtaosa käyttää CSS-valitsimia (td.titleColumn, td.ratingColumn), joita ei ole ollut olemassa sitten kesäkuun 2023, jolloin IMDb uudisti Top 250 -sivunsa. Lopputulos? Foorumit ovat täynnä kehittäjiä kysymässä: "miksi koodini palauttaa tyhjää?" ja suosittujen kirjastojen, kuten , että "paljoa emme voi tehdä muuta kuin korjata jokainen parseri." Tämä opas kattaa kaksi Python-menetelmää, jotka toimivat juuri nyt, miten käsitellä sivutusta ja yleisiä virheitä, milloin Python ei ole edes oikea työkalu, sekä miten varmistat kaavintasi tulevaisuuden keston, jotta se ei päädy hautuumaalle.

Mitä IMDb:n kaavinta Pythonilla tarkoittaa?

Web-kaavinta on prosessi, jossa dataa poimitaan verkkosivuilta ohjelmallisesti — sen sijaan, että kopioisit ja liittäisit manuaalisesti, kirjoitat skriptin hoitamaan sen puolestasi. Kun puhumme "IMDb:n kaavinnasta", tarkoitamme jäsennellyn elokuvatiedon (nimikkeet, arvosanat, genret, näyttelijät, kesto, äänimäärät) poimimista IMDb:n sivuilta Pythonilla.

Tyypillinen Python-pinoteknologia tähän sisältää kolme kirjastoa: requests (verkkosivun noutamiseen), BeautifulSoup (HTML:n jäsentämiseen ja datan löytämiseen) ja pandas (tulosten järjestämiseen ja vientiin). Jotkin ohjeet käyttävät myös Seleniumiä tai Playwrightia sivuille, jotka vaativat JavaScript-renderöintiä, mutta kuten huomaat, nopeampiakin tapoja on.

Yksi tärkeä huomio: kaikki tässä oppaassa on varmennettu IMDb:n nykyistä sivurakennetta vastaan vuoden 2025 puolivälin tilanteen mukaan. IMDb muuttaa asioita suunnilleen 6–12 kuukauden välein, joten jos luet tätä vuonna 2027, osa valitsimista saattaa olla vaihtunut. (Kerron myös, miten se käsitellään.)

Miksi kaapia IMDb:tä Pythonilla? Käytännön käyttötapaukset

Ennen kuin kirjoitat yhtäkään riviä koodia, mitä tekisit IMDb-datalla? Vastaus riippuu siitä, kuka olet.

IMDb:n arvosteludatasetti on yksi maailman käytetyimmistä NLP-vertailuaineistoista — Maas et al. (2011) -perustutkimus on kerännyt , ja datasetti on sisäänrakennettuna TensorFlow’hon, Kerasiin ja PyTorchiin. Hugging Facessa stanfordnlp/imdb-datasetti saa 213 321 latausta kuukaudessa ja sitä on käytetty yli 1 500 mallin kouluttamiseen. Jos siis työskentelet koneoppimisen parissa, olet todennäköisesti jo tuttu IMDb-datan kanssa.

Mutta käyttötapaukset ulottuvat paljon akateemista maailmaa laajemmalle:

KäyttötapausKenelleTarvittavat kentät
ElokuvasuositusmoottoriData scientistit, harrastajatNimikkeet, genret, arvosanat, näyttelijät
Suoratoistoalustan sisältöstrategiaTuote- ja sisältötiimitArvosanat, äänimäärät, julkaisuvuosi, genret
Sentimenttianalyysi / NLP-koulutusML-tutkijat, opiskelijatArvostelut, arvosanat
Kilpailija-analyysi sisällöstäViihdealan analyytikotLipputulot, julkaisupäivät, arvosanatrendit
Elokuvamatkailun tutkimusMatkailuviranomaiset, matkailuyrityksetKuvauspaikat, suosion mittarit
Akateeminen tutkimusYliopistotutkijatMikä tahansa jäsennelty elokuvatieto

Pelkästään elokuvamatkailumarkkinan arvoksi arvioidaan . Netflix käytti vuonna 2024 sisältöön yli 17 miljardia dollaria, ja syntyi personoitujen suositusten kautta. Pointti on tämä: IMDb-data ohjaa oikeita päätöksiä eri toimialoilla.

Vaihtoehtosi IMDb-datan hankintaan (ennen kuin kirjoitat riviäkään koodia)

Tämä on se kohta, jonka useimmat oppaat ohittavat täysin. Ne hyppäävät suoraan kohtaan pip install beautifulsoup4 kysymättä, onko Python-kaavinta edes oikea lähestymistapa sinun tilanteeseesi.

Tässä koko vaihtoehtokenttä:

TapaParhaiten sopiiHyödytHaitat
Python + BeautifulSoupOppimiseen, räätälöityyn poimintaanTäysi hallinta, joustavaHauras, valitsimet rikkoutuvat usein
JSON-LD / __NEXT_DATA__ -poimintaKehittäjille, jotka haluavat vakauttaKäsittelee JS-sisällön, kestävämpiVaatii JSON-rakenteen ymmärtämistä
IMDb:n viralliset datasetitLaajamittaiseen analyysiin, akateemiseen käyttöönLaillinen, kattava, yli 26 miljoonaa nimikettä, päivitykset päivittäinTSV-muoto, ei arvosteluja/kuvia
Cinemagoer (IMDbPY) -kirjastoOhjelmallisiin nimikehakuisiinPython-tyylinen API, runsaat kentät88 avointa ongelmaa, viimeisin julkaisu toukokuussa 2023
TMDb APIElokuvatieto + kuvatIlmainen API-avain, JSON, hyvin dokumentoituEri lähde (ei IMDb-arvosanat)
Thunderbit (ei-koodia)Ei-koodaajille, nopeisiin vientitehtäviin2-klikkauksen kaavinta, AI ehdottaa kenttiä, vienti Exceliin/SheetsiinSuurissa kaavinoissa krediittipohjainen

Muutama huomio näistä vaihtoehdoista. Cinemagoerilla ei ole ollut PyPI-julkaisua sitten toukokuun 2023, ja suurin osa sen parsereista hajosi IMDb:n kesäkuun 2025 uudistuksen jälkeen — en suosittelisi sitä tuotantokäyttöön juuri nyt. TMDb on erinomainen, mutta käyttää omaa arvojärjestelmäänsä, ei IMDb:n. Ja IMDb:n virallinen yritys-API maksaa AWS Data Exchangen kautta, joten se ei ole useimmille realistinen vaihtoehto.

Lukijoille, jotka eivät halua kirjoittaa koodia lainkaan, lukee IMDb-sivun, ehdottaa poimintakentät automaattisesti (nimike, arvosana, vuosi, genre) ja vie tiedot Exceliin, Google Sheetiin, Airtableen tai Notioniin kahdella klikkauksella. AI mukautuu, kun IMDb muuttaa ulkoasuaan, joten valitsimia ei tarvitse ylläpitää. Lisää siitä myöhemmin.

Mutta jos haluat kirjoittaa Pythonia, tässä ovat kaksi toimivaa menetelmää.

Menetelmä 1: IMDb:n kaavinta Pythonilla BeautifulSoupilla (perinteinen tapa)

Tämä on klassinen lähestymistapa, jonka löydät useimmista ohjeista. Se toimii, mutta sanon sen suoraan: se on hauraimmasta päästä kaikista tässä käsiteltävistä menetelmistä. IMDb:n CSS-luokkien nimet luodaan automaattisesti ja ne vaihtuvat uudistusten yhteydessä. Toisaalta tämä on paras tapa oppia web-kaavinnan perusteet.

Vaihe 1: Asenna ja tuo Python-kirjastot

Tarvitset neljä pakettia:

1pip install requests beautifulsoup4 pandas lxml

Mitä kukin tekee:

  • requests — lähettää HTTP-pyyntöjä verkkosivun hakemiseksi
  • beautifulsoup4 — jäsentää HTML:n, jotta voit etsiä tiettyjä elementtejä
  • pandas — järjestää poimitun datan taulukoiksi ja vie CSV/Excel-muotoon
  • lxml — nopea HTML-jäsentäjä (BeautifulSoup voi käyttää sitä taustalla)

Import-lohko:

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

Vaihe 2: Lähetä HTTP-pyyntö IMDb:lle

Tässä moni aloittelija törmää ensimmäiseen esteeseensä. IMDb estää pyynnöt, joista puuttuu kunnollinen User-Agent-otsake — saat 403 Forbidden -virheen. Python Requestsin oletusarvoinen user-agent-merkkijono (python-requests/2.31.0) tunnistetaan heti.

1url = "https://www.imdb.com/chart/top/"
2headers = {
3    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, kuten 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"Sivun nouto epäonnistui: {response.status_code}")
9else:
10    print("Sivu noudettu onnistuneesti")

Myös Accept-Language-otsake on tärkeä — ilman sitä IMDb saattaa palauttaa sisältöä eri kielellä IP-osoitteesi sijainnin perusteella.

Vaihe 3: Jäsennä HTML BeautifulSoupilla

Kun sinulla on HTML, luo BeautifulSoup-objekti ja ala etsiä oikeita elementtejä. Avaa IMDb Top 250 -sivu Chromessa, klikkaa hiiren oikealla elokuvan nimeä ja valitse "Inspect", jotta näet taustalla olevan HTML-rakenteen.

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

Vuoden 2025 puolivälissä Top 250 -sivu käyttää näitä valitsimia:

  • Elokuvakontti: li.ipc-metadata-list-summary-item
  • Otsikko: h3.ipc-title__text
  • Vuosi: span.cli-title-metadata-item (ensimmäinen span)
  • Arvosana: span.ipc-rating-star--rating

Varoituksen sana: nuo ipc--etuliitteiset luokkanimet on luonut IMDb:n komponenttijärjestelmä. Ne ovat pysyneet samoina kesäkuun 2023 uudistuksen jälkeen, mutta mitään takuuta siitä ei ole, etteivät ne muuttuisi taas.

Vaihe 4: Poimi elokuvatiedot (otsikko, vuosi, arvosana)

Tässä poikkean useimmista ohjeista: lisään try/except-virheenkäsittelyn. Yksikään tarkistamistani kilpailijaoppaista ei tee tätä, ja juuri siksi niiden koodi hajoaa hiljaisesti, kun valitsin muuttuu.

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"Virhe elokuvan jäsentämisessä: {e}")
18        continue
19print(f"Poimittiin {len(movies)} elokuvaa")

Vaihe 5: Tallenna CSV- tai Excel-muotoon Pandasilla

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())

Esimerkkituloste:

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

Se toimii. Mutta se on koottu CSS-valitsimilla, jotka voivat rikkoutua minä päivänä tahansa — ja siksi siirrymme lähestymistapaan, jota itse suosittelen.

Menetelmä 2: JSON-LD-temppu — ohita HTML-jäsentäminen kokonaan

Tämä on tekniikka, jota yksikään kilpailija-artikkeli ei käsittele, ja juuri tätä käyttäisin missä tahansa vakavassa projektissa. IMDb upottaa jäsenneltyä dataa (JavaScript Object Notation for Linked Data) <script type="application/ld+json"> -tageihin jokaisella sivulla. Tämä data noudattaa Schema.org-standardia, Google käyttää sitä rikastettuihin hakutuloksiin, ja se muuttuu paljon harvemmin kuin CSS-luokkien nimet.

Apifyn IMDb Scraper, tuotantokelpoinen työkalu, käyttää poiminnan prioriteettijärjestystä: "JSON-LD > NEXT_DATA > DOM." Se on hierarkia, jota suosittelen itsekin.

Miksi JSON-LD on luotettavampi kuin CSS-valitsimet

LähestymistapaKäsittelee JS-sisällön?Kestääkö UI-muutoksia?NopeusMonimutkaisuus
BeautifulSoup + CSS-valitsimet❌ Ei⚠️ Hauras (luokkanimet vaihtuvat)NopeaMatala
JSON-LD-poiminta✅ Kyllä✅ Noudattaa Schema.org-standardiaNopeaMatala-keskitaso
__NEXT_DATA__ JSON -poiminta✅ Kyllä✅ Melko vakaaNopeaMatala-keskitaso
Selenium / Playwright✅ Kyllä⚠️ HaurasHidasKeskitaso-korkea
Thunderbit (ei-koodia, 2 klikkausta)✅ Kyllä (AI lukee sivun)✅ AI mukautuu automaattisestiNopeaEi lainkaan

CSS-luokanimet kuten ipc-metadata-list-summary-item ovat IMDb:n React-komponenttijärjestelmän automaattisesti luomia ja vaihtuvat jokaisen uudistuksen yhteydessä. JSON-LD-skeema kuvaa itse datamallin, ei esitystasoa. Ero on sama kuin siinä, luetko kirjan sisällysluetteloa vai yritätkö tunnistaa luvut niiden fonttikoon perusteella.

css-selectors-vs-json-ld.webp

Vaihe vaiheelta: poimi IMDb-data JSON-LD:stä

Vaihe 1: Nouda sivu

Sama kuin aiemmin — käytä requests-kirjastoa ja kunnollista User-Agent-otsaketta.

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, kuten 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")

Vaihe 2: Etsi JSON-LD-script-tagi

1script_tag = soup.find("script", {"type": "application/ld+json"})
2if not script_tag:
3    print("Tästä sivusta ei löytynyt JSON-LD:tä")
4else:
5    data = json.loads(script_tag.string)
6    print(f"Löydetty JSON-LD, tyyppi: {data.get('@type', 'tuntematon')}")

Vaihe 3: Jäsennä jäsennelty data

Top 250 -sivulla JSON-LD sisältää itemListElement-taulukon, jossa on kaikki 250 elokuvaa. Jokainen merkintä sisältää sijainnin, nimen, URL-osoitteen, aggregateRatingin, datePublishedin, genren, kuvauksen, ohjaajan ja näyttelijätaulukot.

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    })

Vaihe 4: Vie CSV-muotoon

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

Esimerkkituloste:

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

Kaikki 250 elokuvaa. Siistiä, jäsenneltyä, ei CSS-valitsimen akrobatiaa. Ja koska tämä data seuraa Schema.org-standardia (johon Google hakutuloksissaan nojaa), se muuttuu paljon epätodennäköisemmin kuin visuaalinen ulkoasu.

Bonus: __NEXT_DATA__ yksittäisille elokuvasivuille

Rikkaampaa dataa yksittäisiltä nimikesivuilta (kesto, koko näyttelijäkaarti, juonikuvaukset, julistekuvat) varten IMDb upottaa myös __NEXT_DATA__-JSON-objektin. Tämä on data, jota React käyttää sivun hydratoimiseen — sitä ei voi poistaa rikkomatta sivustoa.

1# Yksittäisellä elokuvasivulla, kuten /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"]

Käytä JSON-LD:tä listaus- ja chart-sivuille, __NEXT_DATA__:a yksittäisille nimikesivuille. Se on tuotantokelpoinen lähestymistapa.

Miksi IMDb-kaavintasi hajoaa jatkuvasti (ja miten se korjataan)

Tämä on yksittäinen useimmin raportoitu kipukohta kaikissa IMDb-kaavintafoorumeissa, joita tarkistin. Käyttäjät kirjoittavat: "Osa koodista hajosi käyttöliittymämuutosten takia" ja "Ei toimi vuonna 2024!" — ja vastaus on yleensä hiljaisuus tai "kokeile Seleniumia".

Perimmäinen syy on IMDb:n käynnissä oleva siirtymä React/Next.js-frontendtiin. Tässä aikajana suurimmista rikkojamuutoksista:

PäivämääräMikä muuttuiMikä rikkoutui
Marras 2022Name Pages uudistettiinVanhat nimikesivukaapimet
Kesä 2023Top 250 -sivu uudistettiinKaikki td.titleColumn / td.ratingColumn -valitsimet
Huhti 2023Nimikesivun alisivut uudistettiinBio-, palkinto- ja uutiskaapimet
Loka 2023Advanced Search uudistettiinHakupohjaiset kaapimet
Kesä 2025/reference-sivut uudistettiinCinemagoer-kirjasto (useimmat parserit)

Se on suunnilleen yksi merkittävä rikkova muutos 6–12 kuukauden välein. Jos kaavintasi nojaa CSS-luokkanimiin, olet juoksumatolla.

Yleiset virheet ja niiden korjaaminen

Tyhjät tulokset / NoneType-virheet

Yleisin virhe. Näet AttributeError: 'NoneType' object has no attribute 'text'. Tämä tarkoittaa, että BeautifulSoup ei löytänyt etsimääsi elementtiä — yleensä siksi, että CSS-luokan nimi muuttui tai sisältö renderöidään JavaScriptillä.

Korjaus: Siirry JSON-LD-poimintaan (yllä oleva menetelmä 2). Data on alkuperäisessä HTML-vastauksessa, eikä JavaScriptiä tarvita.

403 Forbidden

IMDb käyttää bottien tunnistamiseen ja estämiseen. Ykköslaukaisija on puuttuva tai ilmiselvästi feikki User-Agent-otsake. Tämä on dokumentoitu useissa sekä , joissa IMDb:n työntekijä myönsi ongelman.

Korjaus: Lisää aina realistinen selainpohjainen User-Agent-merkkijono ja Accept-Language: en-US -otsake. Käytä requests.Session()-oliota yhteyksien poolaukseen.

Vain 25 tulosta palautuu

IMDb:n hakusivut ja "Most Popular" -listat käyttävät laiskaa latausta — ne renderöivät aluksi vain noin 25 tulosta ja lataavat lisää AJAXin kautta, kun vierität.

Korjaus: Käytä URL-parametrin sivutusta (käsitellään seuraavassa osiossa) tai vaihda Top 250 -sivuun, joka lataa kaikki 250 elokuvaa yhdellä vastauksella.

Valitsimet lakkaavat yhtäkkiä toimimasta

Vanhat valitsimet, jotka eivät enää toimi: td.titleColumn, td.ratingColumn, .lister-item-header, .inline-block.ratings-imdb-rating. Jos koodisi käyttää jotakin näistä, se on rikki.

Korjaus: Suosi data-testid-attribuutteja (kuten h1[data-testid="hero-title-block__title"]) automaattisesti luotujen luokkanimien sijaan. Vielä parempi: käytä JSON-LD:tä.

Päätösmalli: lyhyen aikavälin vs. pitkän aikavälin korjaukset

  • Pikakorjaus: Lisää try/except-lohkot jokaisen valitsimen ympärille, tarkista HTTP-statuskoodit, lokita virheet kaatumisen sijaan
  • Keskipitkän aikavälin korjaus: Vaihda CSS-valitsimista JSON-LD-poimintaan (menetelmä 2)
  • Pitkän aikavälin korjaus: Käytä laajamittaiseen analyysiin tai työkalua kuten , joka käyttää AI:ta lukemaan sivurakenteen uudelleen joka kerta — ei valitsimia ylläpidettäväksi, AI mukautuu ulkoasumuutoksiin automaattisesti

25 tuloksen rajan yli: IMDb:n sivutus ja suuret datasetit

Jokainen tarkistamani kilpailijaopas kaapii täsmälleen yhden sivun. Kukaan ei käsittele sivutusta. Mutta jos tarvitset enemmän kuin yhden listan, törmäät nopeasti rajoihin.

Sivut, jotka eivät tarvitse sivutusta

Hyvä uutinen: Top 250 -sivu lataa kaikki 250 elokuvaa yhdellä palvelinrenderöidyllä vastauksella. Sekä JSON-LD että __NEXT_DATA__ sisältävät koko datasetin. Sivutusta ei tarvita.

Miten IMDb:n hakusivujen sivutus toimii

IMDb:n hakusivut käyttävät start=-URL-parametria, joka kasvaa 50:llä:

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

Tässä on Python-silmukka, joka selaa tuloksia sivu sivulta:

1import time
2all_movies = []
3for start in range(1, 1001, 50):  # Selaa top 1000 -listaa
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"Epäonnistui kohdassa start={start}: {response.status_code}")
8        break
9    soup = BeautifulSoup(response.text, "lxml")
10    # Poimi elokuvat haluamallasi menetelmällä
11    # ...
12    print(f"Kaavittiin sivu alkaen kohdasta {start}")
13    time.sleep(3)  # Ole kohtelias — IMDb estää noin 50 nopean pyynnön jälkeen

Tuo time.sleep(3) on tärkeä. Yhteisöraporttien mukaan IMDb alkaa estää IP-osoitteita noin 50 nopean pyynnön jälkeen. Satunnainen 2–5 sekunnin viive on hyvä käytäntö.

Milloin kaavinta kannattaa jättää kokonaan väliin: IMDb:n viralliset massadatasetit

Todella laajamittaiseen tarpeeseen IMDb tarjoaa 7 ilmaista TSV-tiedostoa osoitteessa , päivittyen päivittäin:

TiedostoSisältöKoko
title.basics.tsv.gzNimikkeet, tyypit, genret, kesto, vuosi~800 MB
title.ratings.tsv.gzKeskiarvoarvosana, äänimäärä~25 MB
title.crew.tsv.gzOhjaajat, käsikirjoittajat~300 MB
title.principals.tsv.gzPääosien näyttelijät/tekijät~2 GB
title.akas.tsv.gzVaihtoehtoiset nimikkeet alueittain~1,5 GB
title.episode.tsv.gzTV-jaksotiedot~200 MB
name.basics.tsv.gzHenkilöt: nimi, syntymävuosi, tunnetut nimikkeet~700 MB

Niiden lataaminen Pandasiin on suoraviivaista:

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# Yhdistä tconstin perusteella (IMDb:n nimike-ID)
4merged = basics.merge(ratings, on="tconst")
5top_movies = merged[merged["titleType"] == "movie"].nlargest(250, "averageRating")

Nämä datasetit kattavat yli 26 miljoonaa nimikettä. Ei sivutusta, ei valitsimia, ei 403-virheitä. Lisenssi on vain henkilökohtaiseen ja ei-kaupalliseen käyttöön — et voi julkaista tai jälleenmyydä dataa.

Ei-koodia-vaihtoehto: Thunderbit hoitaa sivutuksen puolestasi

Lukijoille, jotka tarvitsevat sivutettua IMDb-dataa mutta eivät halua kirjoittaa sivutuslogiikkaa, tukee natiivisti sekä klikkauspohjaista sivutusta että loputonta vieritystä. Kerrot sille, mitä kaavitaan, se hoitaa loput — myös laiskasti ladatun sisällön vierittämisen.

Kaavi IMDb Pythonilla: täydellinen toimiva koodi (valmiina kopioitavaksi)

Tässä ovat kaksi itsenäistä skriptiä, jotka voit ajaa heti.

Skripti A: BeautifulSoup-menetelmä (CSS-valitsimet)

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, kuten 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"Virhe: {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"Ohitetaan elokuva virheen vuoksi: {e}")
28df = pd.DataFrame(movies)
29df.to_csv("imdb_top250_bs4.csv", index=False)
30print(f"Tallennettu {len(df)} elokuvaa")
31print(df.head())

Skripti B: JSON-LD-menetelmä (suositeltu)

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, kuten 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"Virhe: {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("JSON-LD-dataa ei löytynyt")
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"Tallennettu {len(df)} elokuvaa")
42print(df.head())

Molemmat skriptit sisältävät virheenkäsittelyn ja tuottavat siistiä CSV-tulosta. Skripti B antaa sinulle rikkaamman datan — ohjaajan, kuvauksen, URL:n — ja kestää paremmin ulkoasun muutoksia.

Miten kaapata IMDb ilman koodia (Thunderbitillä)

Kaikki eivät tarvitse tai halua kirjoittaa Pythonia. Ehkä olet operaatioanalyytikko, joka tarvitsee tämän viikon parhaiten arvioidut elokuvat taulukkoon. Ehkä olet sisältöstrategi, joka haluaa vertailla genretreendejä vuosien yli. Silloin kaavintaohjelman kirjoittaminen on ylimitoitettua.

Näin saat saman datan :

Ennen aloittamista:

  • Vaikeustaso: Aloittelija
  • Kesto: noin 2 minuuttia
  • Tarvitset: Chrome-selaimen, (ilmainen taso toimii)

Vaihe 1: Siirry IMDb-sivulle, jonka haluat kaapia. Avaa IMDb Top 250 (tai mikä tahansa muu IMDb:n lista-/hakusivu) Chromessa.

Vaihe 2: Klikkaa Thunderbit-sivupalkista "AI Suggest Fields". AI skannaa sivun ja suosittelee sarakkeita — tyypillisesti Title, Year, Rating, Genre ja muutamia muita sivusta riippuen. Näet esikatselutaulukon ehdotetuilla kentillä.

Vaihe 3: Säädä kenttiä tarvittaessa. Poista sarakkeet, joita et tarvitse, tai lisää omia klikkaamalla "+ Add Column" ja kuvaamalla, mitä haluat luonnollisella englannilla (esim. "Director name" tai "Number of votes").

Vaihe 4: Klikkaa "Scrape." Thunderbit poimii datan. Sivuilla, joilla on loputon vieritys tai sivutus, se hoitaa vierityksen automaattisesti.

Vaihe 5: Vie tiedot. Klikkaa vientipainiketta ja valitse muoto — Excel, Google Sheets, CSV, Airtable tai Notion. Data päätyy kohteeseesi sekunneissa.

Tässä keskeinen etu ei ole vain mukavuus — Thunderbitin AI lukee sivurakenteen joka kerta uudelleen. Kun IMDb muuttaa ulkoasuaan (ja se muuttaa), AI mukautuu. Ei valitsimia päivitettäväksi, ei koodia korjattavaksi. Jokaiselle, jonka kaavinta on hajonnut klo 2 aamulla ennen deadlinea, tämä on paljon arvokasta.

Thunderbit tukee myös alasivujen kaavintaa — voit avata kunkin elokuvan yksityiskohtaisen sivun ja rikastaa taulukkoasi näyttelijöillä, ohjaajalla, kestolla ja muilla kentillä, jotka eivät näy listasivulla. Jos haluat nähdä sen toiminnassa, tutustu .

Onko IMDb:n kaavinta laillista? Mitä sinun on tiedettävä

Käyttäjät kysyvät tätä suoraan foorumeilla: "Onko tällainen laillista?… IMDb ei halua ihmisten kaapivan heidän verkkosivuaan." Se on aiheellinen kysymys, eikä yksikään kilpailija-artikkeli käsittele sitä.

IMDb:n robots.txt: Top 250 -taulukko (/chart/top/), yksittäiset nimikesivut (/title/ttXXXXXXX/) ja henkilösivut (/name/nmXXXXXXX/) eivät ole robots.txt:n estämiä. Estettyihin polkuihin kuuluvat /find, /_json/*, /search/name-text, /user/ur*/ratings sekä erilaiset AJAX-päätepisteet. Crawl-delay-ohjetta ei ole määritelty.

IMDb:n käyttöehdot: Relevantti ehto kuuluu: "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." Toinen ehto kieltää kaavittujen tietojen jälleenmyynnin tai kaupallisen käytön.

Mitä tämä tarkoittaa käytännössä: Tuoreet vuoden 2024 oikeuden päätökset (Meta v. Bright Data, X Corp v. Bright Data) viittasivat siihen, että käyttöehdot eivät välttämättä sido käyttäjiä, jotka eivät ole koskaan hyväksyneet niitä — jos kaavit julkisesti saatavilla olevaa dataa ilman kirjautumista, käyttöehtojen sitovuus on kiistanalainen. Mutta oikeudellinen kenttä elää.

Turvalliset vaihtoehdot: IMDb:n on nimenomaisesti hyväksytty henkilökohtaiseen ja ei-kaupalliseen käyttöön. TMDb:n API on salliva ilmaisen API-avaimen kanssa. Molemmat ovat varmoja vaihtoehtoja, jos haluat pysyä selvästi turvallisella puolella.

Käytännön ohje: Jos kaavit, käytä kohteliasta nopeutta (time.sleep(3) pyyntöjen välillä), aseta kunnolliset otsakkeet äläkä osu robots.txt:n estämiin polkuihin. Kaupallisiin projekteihin kannattaa konsultoida juristia tai käyttää virallisia datasetit/API:a.

Olemme käsitelleet perusteellisesti Thunderbit-blogissa.

Yhteenveto: valitse oikea tapa kaapata IMDb Pythonilla

Lyhyt versio:

  • BeautifulSoup + CSS-valitsimet: Hyvä perusteiden oppimiseen. Varaudu siihen, että se hajoaa 6–12 kuukauden välein. Lisää aina virheenkäsittely.
  • JSON-LD-poiminta: Lähestymistapa, jota suosittelisin mihin tahansa jatkuvaan Python-projektiin. Noudattaa Schema.org-standardia, muuttuu paljon harvemmin kuin CSS-luokat ja antaa siistiä jäsenneltyä dataa ilman JavaScript-renderöintiä.
  • __NEXT_DATA__-JSON: Käytä tätä lisänä rikkaampaa dataa varten yksittäisillä nimikesivuilla (kesto, koko näyttelijäkaarti, juoni, julistekuvat).
  • IMDb:n viralliset datasetit: Paras valinta laajamittaiseen analyysiin. Yli 26 miljoonaa nimikettä, päivittyy päivittäin, kaavintaa ei tarvita. Vain henkilökohtaiseen/eikaupalliseen käyttöön.
  • : Paras valinta ei-koodaajille tai kenelle tahansa, joka haluaa dataa nopeasti ilman koodin ylläpitoa. AI mukautuu ulkoasumuutoksiin, hoitaa sivutuksen ja vie tiedot Exceliin/Sheetsiin/Airtableen/Notioniin.

Lisää tämä opas kirjanmerkkeihin — päivitän sen, kun IMDb:n rakenne muuttuu seuraavan kerran. Ja jos haluat jättää koodin kokonaan väliin, ja katso, kuinka nopeasti pääset IMDb-sivulta siistiin taulukkoon. Jos työskentelet myös muiden sivustojen kanssa, oppaamme kattaa laajemman työnkulun.

Kokeile AI Web Scraperia IMDb:tä ja muuta varten

Usein kysytyt kysymykset

Onko IMDb:n kaavinta laillista?

IMDb:n käyttöehdot kieltävät kaapimisen ilman suostumusta, mutta käyttöehtojen sitovuus julkisesti saatavilla olevan datan kohdalla on oikeudellisesti kiistanalainen tuoreiden vuoden 2024 oikeuden ratkaisujen jälkeen. Turvallisimmat vaihtoehdot ovat IMDb:n (henkilökohtaiseen/eikaupalliseen käyttöön) tai TMDb:n API (ilmainen avain). Jos kaavit, kunnioita robots.txt:ää, käytä kohtuullisia viiveitä pyyntöjen välillä ja vältä estettyjä polkuja. Kaupalliseen käyttöön kannattaa konsultoida juristia.

Miksi IMDb-kaavintani palauttaa tyhjiä tuloksia?

Lähes aina syynä ovat vanhentuneet CSS-valitsimet — luokkanimet kuten td.titleColumn ja td.ratingColumn eivät ole olleet olemassa sitten kesäkuun 2023. Korjaus on siirtyä JSON-LD-poimintaan (jäsennä <script type="application/ld+json"> -tagi) tai päivittää valitsimet nykyisiin ipc--etuliitteisiin luokkiin. Varmista myös, että mukana on kunnollinen User-Agent-otsake, sillä puuttuva otsake aiheuttaa 403-virheen, joka voi näyttää tyhjiltä tuloksilta.

Miten poimin yli 25 tulosta IMDb:stä?

Top 250 -sivu lataa kaikki 250 elokuvaa yhdellä vastauksella — sivutusta ei tarvita. Hakutuloksissa käytä start=-URL-parametria (kasvatetaan 50:llä) selaamaan tuloksia. Esimerkiksi: start=1, start=51, start=101. Lisää pyyntöjen väliin time.sleep(3), jotta vältyt estolta. Vaihtoehtoisesti IMDb:n virallisissa datasetissä osoitteessa on yli 26 miljoonaa nimikettä, eikä sivutusta tarvita.

Mikä on __NEXT_DATA__ ja miksi sitä kannattaa käyttää IMDb:n kaavintaan?

__NEXT_DATA__ on JSON-objekti, joka on upotettu <script id="__NEXT_DATA__"> -tagiin IMDb:n React/Next.js-sivuilla. Se sisältää koko jäsennellyn datan, jota React käyttää sivun renderöintiin — nimikkeet, arvosanat, näyttelijät, genret, keston ja paljon muuta. Koska se kuvaa taustalla olevaa datamallia eikä visuaalista ulkoasua, se kestää käyttöliittymän uudistuksia paremmin kuin CSS-valitsimet. Käytä sitä yhdessä JSON-LD:n kanssa saadaksesi mahdollisimman kestävän poimintatavan.

Voinko kaapata IMDb:tä ilman koodaamista?

Kyllä. Kaksi päävaihtoehtoa: (1) Lataa IMDb:n — 7 TSV-tiedostoa, jotka kattavat yli 26 miljoonaa nimikettä, päivittyvät päivittäin ja ovat ilmaisia ei-kaupalliseen käyttöön. (2) Käytä , joka lukee IMDb-sivun, ehdottaa poimintakentät automaattisesti ja vie tiedot Exceliin, Google Sheetiin tai CSV:ksi kahdella klikkauksella — ei koodia, ei ylläpidettäviä valitsimia.

Lisää luettavaa

Ke
Ke
Thunderbitin CTO. Ke on se tyyppi, jolle kaikki laittavat viestiä, kun data menee sotkuiseksi. Hän on uransa aikana muuttanut tylsän, toistuvan työn huomaamattomiksi automaatioiksi, jotka vain pyörivät taustalla. Jos olet joskus toivonut, että taulukkolaskenta täyttyisi itsestään, Ke on todennäköisesti jo rakentanut sen, joka tekee sen.
Sisällysluettelo

Kokeile Thunderbitiä

Poimi liidejä ja muuta dataa vain 2 klikkauksella. AI:n voimalla.

Hanki Thunderbit Se on ilmaista
Poimi dataa AI:n avulla
Siirrä data helposti Google Sheetsiin, Airtableen tai Notioniin
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week