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ötapaus | Kenelle | Tarvittavat kentät |
|---|---|---|
| Elokuvasuositusmoottori | Data scientistit, harrastajat | Nimikkeet, genret, arvosanat, näyttelijät |
| Suoratoistoalustan sisältöstrategia | Tuote- ja sisältötiimit | Arvosanat, äänimäärät, julkaisuvuosi, genret |
| Sentimenttianalyysi / NLP-koulutus | ML-tutkijat, opiskelijat | Arvostelut, arvosanat |
| Kilpailija-analyysi sisällöstä | Viihdealan analyytikot | Lipputulot, julkaisupäivät, arvosanatrendit |
| Elokuvamatkailun tutkimus | Matkailuviranomaiset, matkailuyritykset | Kuvauspaikat, suosion mittarit |
| Akateeminen tutkimus | Yliopistotutkijat | Mikä 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ä:
| Tapa | Parhaiten sopii | Hyödyt | Haitat |
|---|---|---|---|
| Python + BeautifulSoup | Oppimiseen, räätälöityyn poimintaan | Täysi hallinta, joustava | Hauras, valitsimet rikkoutuvat usein |
JSON-LD / __NEXT_DATA__ -poiminta | Kehittäjille, jotka haluavat vakautta | Käsittelee JS-sisällön, kestävämpi | Vaatii JSON-rakenteen ymmärtämistä |
| IMDb:n viralliset datasetit | Laajamittaiseen analyysiin, akateemiseen käyttöön | Laillinen, kattava, yli 26 miljoonaa nimikettä, päivitykset päivittäin | TSV-muoto, ei arvosteluja/kuvia |
| Cinemagoer (IMDbPY) -kirjasto | Ohjelmallisiin nimikehakuisiin | Python-tyylinen API, runsaat kentät | 88 avointa ongelmaa, viimeisin julkaisu toukokuussa 2023 |
| TMDb API | Elokuvatieto + kuvat | Ilmainen API-avain, JSON, hyvin dokumentoitu | Eri lähde (ei IMDb-arvosanat) |
| Thunderbit (ei-koodia) | Ei-koodaajille, nopeisiin vientitehtäviin | 2-klikkauksen kaavinta, AI ehdottaa kenttiä, vienti Exceliin/Sheetsiin | Suurissa 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 hakemiseksibeautifulsoup4— jäsentää HTML:n, jotta voit etsiä tiettyjä elementtejäpandas— järjestää poimitun datan taulukoiksi ja vie CSV/Excel-muotoonlxml— 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ähestymistapa | Käsittelee JS-sisällön? | Kestääkö UI-muutoksia? | Nopeus | Monimutkaisuus |
|---|---|---|---|---|
| BeautifulSoup + CSS-valitsimet | ❌ Ei | ⚠️ Hauras (luokkanimet vaihtuvat) | Nopea | Matala |
| JSON-LD-poiminta | ✅ Kyllä | ✅ Noudattaa Schema.org-standardia | Nopea | Matala-keskitaso |
__NEXT_DATA__ JSON -poiminta | ✅ Kyllä | ✅ Melko vakaa | Nopea | Matala-keskitaso |
| Selenium / Playwright | ✅ Kyllä | ⚠️ Hauras | Hidas | Keskitaso-korkea |
| Thunderbit (ei-koodia, 2 klikkausta) | ✅ Kyllä (AI lukee sivun) | ✅ AI mukautuu automaattisesti | Nopea | Ei 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.

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ä muuttui | Mikä rikkoutui |
|---|---|---|
| Marras 2022 | Name Pages uudistettiin | Vanhat nimikesivukaapimet |
| Kesä 2023 | Top 250 -sivu uudistettiin | Kaikki td.titleColumn / td.ratingColumn -valitsimet |
| Huhti 2023 | Nimikesivun alisivut uudistettiin | Bio-, palkinto- ja uutiskaapimet |
| Loka 2023 | Advanced Search uudistettiin | Hakupohjaiset kaapimet |
| Kesä 2025 | /reference-sivut uudistettiin | Cinemagoer-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:
| Tiedosto | Sisältö | Koko |
|---|---|---|
| title.basics.tsv.gz | Nimikkeet, tyypit, genret, kesto, vuosi | ~800 MB |
| title.ratings.tsv.gz | Keskiarvoarvosana, äänimäärä | ~25 MB |
| title.crew.tsv.gz | Ohjaajat, käsikirjoittajat | ~300 MB |
| title.principals.tsv.gz | Pääosien näyttelijät/tekijät | ~2 GB |
| title.akas.tsv.gz | Vaihtoehtoiset nimikkeet alueittain | ~1,5 GB |
| title.episode.tsv.gz | TV-jaksotiedot | ~200 MB |
| name.basics.tsv.gz | Henkilö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.
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
