Site scraper

Scrape IMDb or Use IMDb Datasets: Ratings, Cast and Reviews

HTTP $0.50JS rendering $2.00 per 1,000 results or your own scraper from $1.95/GB

For IMDb ratings, vote counts, titles and principal cast, start with IMDb's own non-commercial datasets: seven gzipped TSV files, refreshed daily, at no charge for personal and non-commercial use, with no review texts. Full cast lists, user reviews and any commercial use need IMDb's licensed data (sold through AWS Data Exchange, with a User Reviews add-on), because IMDb forbids robots and screen scraping without its written permission (Can I use IMDb data in my software?). Where you hold that permission, ProxyField's Web Scraping API is designed to fetch public IMDb pages for $0.50 per 1,000 successful results over plain HTTP, or $0.20 from 10,000 results in one purchase; it is in development, so access is through Contact sales. To run your own scraper, ProxyField residential proxies start with the Easy Trial: 1 GB for $2.95.

Web Scraping API per 1,000 successful results
Web Scraping API prices per 1,000 successful results
FetchEntryVolume, from
HTTP$0.50$0.20
JS rendering$2.00$1.00

Billed on successful results only.

Your own scraper on residential proxies
from $1.95/GB Easy Trial: 1 GB for $2.95
gate.proxyfield.io:7000
Data

IMDb datasets or scraping: which for ratings, cast and reviews?

Use the datasets for anything they hold, a licence for what they don't, and scraping only with IMDb's permission. IMDb's help page says that data not in its datasets "is not available for non-commercial usage" and that you "may not use data mining, robots, screen scraping, or similar" tools on its website (Can I use IMDb data in my software?).

Read moreShow less
You needIMDb non-commercial datasetsIMDb's licensed data (data.imdb.com)Scraping the public pages
Ratings and vote countsYes: title.ratings.tsv.gz (averageRating, numVotes)Yes: the "IMDb Ratings" productTitle page; only with IMDb's written permission
Principal cast and crewYes: title.principals.tsv.gz (category, job, characters); title.crew.tsv.gz (directors, writers)Yes: "IMDb Essential Metadata" (title and name data)/fullcredits; only with permission
Complete cast listNo: title.principals lists principal cast and crew, not every creditLicence needed: the licensed metadata or the IMDb API (GraphQL)/fullcredits; only with permission
User review textsNoLicence needed: the "User Reviews" add-on dataset/reviews; review texts are user content, so add copyright to the terms question
Commercial useNo: personal and non-commercial onlyYes, under IMDb's licenceNot without IMDb's written permission
FreshnessRefreshed dailyUpdated dailyEach time you fetch
How you get itDownload from datasets.imdbws.comAWS Data ExchangeYour scraper, or an API, with permission
CostNo chargePriced by IMDb on AWS Data Exchange$0.50 per 1,000 pages (API design), $0.20 from 10,000

Decision rule:

  1. Ratings, votes, titles, genres, runtimes or principal cast for a personal or non-commercial project: download the datasets and stop there.

  2. Complete cast, review texts, or any commercial product: contact IMDb about licensing first.

  3. Scraping IMDb pages: only with IMDb's express written permission, and then within the pace it sets. ProxyField's rule for every site is public pages only, and follow the site's terms (acceptable use).

In numbers: the datasets cost nothing for non-commercial use and refresh daily; IMDb's licensed products update daily and are priced on AWS Data Exchange; fetching pages through ProxyField's Web Scraping API is designed to cost $0.50 per 1,000 successful results, or $0.20 from 10,000, and only with IMDb's permission.

IMDb's dataset files and columns

IMDb publishes seven files at https://datasets.imdbws.com/. Each one is a gzipped, tab-separated UTF-8 file with a header row, and \N marks a missing value. Since March 18, 2024 the files have been backed by a new data source (IMDb non-commercial datasets).

FileColumnsUse it for
title.basics.tsv.gztconst, titleType, primaryTitle, originalTitle, isAdult, startYear, endYear, runtimeMinutes, genrestitles, years, runtimes, genres
title.ratings.tsv.gztconst, averageRating, numVotesratings and vote counts
title.principals.tsv.gztconst, ordering, nconst, category, job, charactersprincipal cast and crew, with characters
title.crew.tsv.gztconst, directors, writersdirectors and writers
name.basics.tsv.gznconst, primaryName, birthYear, deathYear, primaryProfession, knownForTitlespeople
title.akas.tsv.gztitleId, ordering, title, region, language, types, attributes, isOriginalTitlelocal titles by country and language
title.episode.tsv.gztconst, parentTconst, seasonNumber, episodeNumberseries episodes

tconst is the title ID that starts with tt and nconst the person ID that starts with nm; they join the files to each other and to IMDb's page URLs. This reads the rating of one title with Python's standard library:

Python
import csv, gzip, urllib.request

urllib.request.urlretrieve("https://datasets.imdbws.com/title.ratings.tsv.gz", "title.ratings.tsv.gz")
with gzip.open("title.ratings.tsv.gz", "rt", encoding="utf-8") as f:
    for row in csv.DictReader(f, delimiter="\t", quoting=csv.QUOTE_NONE):
        if row["tconst"] == "tt0111161":
            print(row["averageRating"], row["numVotes"])
            break

IMDb pages and the data on them

Every movie, series and episode on IMDb has a tt title ID and every person an nm name ID, and each ID opens a family of pages. With IMDb's permission, the Web Scraping API is designed to fetch any of them and return the page; your code takes the fields out. ProxyField sells no separate IMDb API with pre-parsed fields.

IMDb pageExample URLWhat the page shows
Title pageimdb.com/title/tt0111161/Title, year, type, rating, vote count, genres, runtime, plot, director, writers, top cast, release date, poster
Full creditsimdb.com/title/tt0111161/fullcreditsComplete cast with characters, and crew by department
User reviewsimdb.com/title/tt0111161/reviewsReview title, text, rating, date, helpfulness votes
Ratings breakdownimdb.com/title/tt0111161/ratingsVotes by star rating
Person pageimdb.com/name/nm0000151/Name, roles, known-for titles, biography summary
Chartsimdb.com/chart/top/, imdb.com/chart/moviemeter/Top 250 by rating, most popular titles right now
Advanced searchimdb.com/search/title/?genres=comedy&title_type=featureTitles filtered by genre, type, year, rating or votes

A title page carries its key facts as structured data in a script tag of type application/ld+json (name, rating, vote count, genres, director, actors), which changes far less often than the visible markup. Lists that grow when a visitor clicks "more", such as long review threads, need JS rendering or the next batch's URL.

Titles and release dates can differ by the visitor's country and language. ProxyField has 61.2M+ residential IPs in the United States and 16.6M+ in the United Kingdom; the API's country parameter takes the proxy pool's 195+ countries as two-letter codes such as us.

What you send

The API's design: a POST to https://api.proxyfield.io/v1/scrape with an Authorization: Bearer <api_key> header and a JSON body of url, render (false for plain HTTP, true for JS rendering), country and output (html, markdown, text or json). Parameter reference: API documentation.

Shell
# The request as designed (in development; access through Contact sales)
curl https://api.proxyfield.io/v1/scrape \
  -H "Authorization: Bearer <api_key>" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.imdb.com/title/tt0111161/", "render": false, "country": "us", "output": "json"}'

Example response (shortened; content is the page's HTML, with the structured data inside):

JSON
{
  "metadata": {"id": "req_de07941f46c4223d", "api": "web_scrape", "status": "success", "billed": true},
  "status_code": 200,
  "final_url": "https://www.imdb.com/title/tt0111161/",
  "content_type": "text/html; charset=utf-8",
  "content": "<!DOCTYPE html><html lang=\"en-US\">…<script type=\"application/ld+json\">…</html>"
}
Pricing

Pricing: $0.50 per 1,000 IMDb pages, $0.20 from 10,000

You pay only for successful results, and every response says whether it was billed. Not billed: error responses, blocked and timed-out requests, and our internal retries. Billed: a page the target answered, including a 404 or 410 and a sign-in page served with a 200 status. Up to 20 concurrent requests per account, and batches of up to 1,000 URLs. The API is paid from the same crypto balance as proxies, which never expires; there is no subscription or monthly fee. For access, contact sales through the sales team on our 24/7 live chat.

Mode
Mode, Price per 1,000 successful results, From 10,000 results in one purchase
ModePrice per 1,000 successful resultsFrom 10,000 results in one purchase
Plain HTTP$0.50$0.20
JS rendering$2.00$1.00
WorkloadPagesAt $0.50At $0.20
5,000 titles, rating and votes, daily (30-day month)150,000$75$30
50,000 title pages and their full credits, once100,000$50$20
1,000 titles, first review page, monthly1,000$0.50–

For ratings alone, the daily title.ratings file is the cheaper route when your use is non-commercial. All prices: pricing.

Through the sales team on our 24/7 live chat

Do it yourself

Run your own IMDb scraper with Python

With IMDb's permission, this script fetches one title page through a ProxyField residential IP and prints the fields from its structured data. It needs pip install requests beautifulsoup4.

Python
import json
import requests
from bs4 import BeautifulSoup

proxy = "http://<login>-country-us-city-new_york:<password>@gate.proxyfield.io:7000"
url = "https://www.imdb.com/title/tt0111161/"
resp = requests.get(url, proxies={"http": proxy, "https": proxy},
                    headers={"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US"},
                    timeout=30)
soup = BeautifulSoup(resp.text, "html.parser")
tag = soup.find("script", type="application/ld+json")
if resp.status_code != 200 or tag is None:
    print("Refused or changed page:", resp.status_code)
else:
    d = json.loads(tag.string)
    r = d.get("aggregateRating", {})
    print(d.get("name"), d.get("datePublished"), r.get("ratingValue"), r.get("ratingCount"))
    print([a.get("name") for a in d.get("actor", [])])
  1. Take the tt IDs from the datasets (title.basics) instead of crawling charts and search.

  2. Fetch only the pages the datasets lack, a second or two apart per IP, or at the pace IMDb sets.

  3. Read the structured data first; fall back to the page for fields it lacks.

  4. Store each record under its tt ID with the date of the check.

The username format is <login>-country-us-city-new_york; other countries take their two-letter code, as in -country-gb, and -session-<id>-ttl-<seconds> (30 to 129,600 seconds, 20 minutes by default) keeps one IP. Residential proxies cost $2.95/GB for 1 GB down to $1.95/GB from 1,000 GB, with no subscription; the traffic never expires, and all purchases are final. More on Python.

When IMDb refuses a request

A request without browser headers looks automated, and a site may answer it with a 403 or an empty page; many requests from one IP get slowed down. If IMDb refuses your requests, treat it as an answer: stop, and check that your use is covered by the datasets or IMDb's permission before you continue.

What people use IMDb data for

  • Film and TV research: ratings, genres and cast across decades (the datasets cover most of it).
  • Recommendation systems and data science projects built on ratings and credits.
  • Release and popularity tracking: vote counts over time from the daily ratings file.
  • Catalog enrichment: matching a streaming or retail catalog to IMDb IDs.
More scrapers

More scrapers

FAQ

Scrape IMDb or Use IMDb Datasets FAQ

24/7 support by live chat, including help with setup and integration.

How much does it cost to scrape IMDb?

ProxyField's Web Scraping API is priced at $0.50 per 1,000 successful IMDb pages over plain HTTP, $0.20 from 10,000 results in one purchase, and $2.00 per 1,000 with JS rendering; it is in development, through Contact sales. Checking 5,000 titles daily is 150,000 pages a month: $75, or $30 at the volume price, while IMDb's daily ratings file costs nothing for non-commercial use.

Should I use IMDb's downloadable datasets or scrape IMDb pages to get movie ratings, cast lists and user reviews?

Use the datasets for ratings and principal cast: title.ratings.tsv.gz has averageRating and numVotes, and title.principals.tsv.gz the principal cast, refreshed daily, for personal and non-commercial use. They have no review texts and not every credit, and IMDb says data outside them is not available for non-commercial use, so complete cast lists and reviews need IMDb's licensed data (the IMDb API or the User Reviews add-on on AWS Data Exchange). Scraping IMDb's pages is forbidden by its conditions of use without its written permission.

Is there an official IMDb API?

Yes, a licensed one: the IMDb API, a GraphQL API sold only through AWS Data Exchange, next to licensed datasets such as IMDb Ratings, IMDb Essential Metadata and a User Reviews add-on (data.imdb.com). For personal and non-commercial use, IMDb also publishes seven dataset files, refreshed daily, at no charge.

What's in IMDb's non-commercial datasets?

Seven gzipped TSV files: title.basics, title.ratings, title.principals, title.crew, title.akas, title.episode and name.basics. They hold titles, years, genres, runtimes, ratings, vote counts, principal cast and crew, local titles, episodes and people, joined by tt and nm IDs.

How do I scrape IMDb data?

First check whether the datasets hold your fields; if they do, download them instead. With IMDb's permission, collect the tt IDs, fetch each title page with browser headers and read its application/ld+json block, which holds name, rating, votes, genres, director and actors.

What data can I get from IMDb?

From the datasets: titles, years, runtimes, genres, ratings, vote counts, principal cast and crew, episodes and people. The pages also show plots, full credits, charts and user reviews, which need IMDb's licence or permission.

What are the main IMDb page types?

Title pages, full credits, user reviews, ratings breakdowns, person pages, charts such as the Top 250, and advanced search results. Each hangs off a stable tt or nm ID, the same IDs the datasets use.

Which IMDb pages hold movie details, reviews and cast data?

The title page for details, /fullcredits for the complete cast and crew, and /reviews for user reviews. The datasets already cover the title page's rating, votes, genres and principal cast.

How do I scrape IMDb reviews?

The datasets contain no review texts, and reviews are user content, so start with IMDb's licensed User Reviews add-on. With permission, fetch imdb.com/title/<tt-id>/reviews; threads that load more on click need JS rendering, at $2.00 per 1,000 pages on the API's design.

What's the best Python library for scraping IMDb?

ProxyField's examples on this page use requests with BeautifulSoup and the json module for title pages you may fetch, and Python's gzip and csv modules for the 7 dataset files. pandas reads the TSV files too, and Playwright is needed only for lists that load on click.

Show 10 more questionsShow fewer questions

Is IMDb still server-rendered enough for BeautifulSoup scraping?

Title pages carry a structured data block in the HTML that BeautifulSoup can read, so test a sample first. Long review threads and advanced search results load further items with scripts, which BeautifulSoup alone does not run.

Why do Python requests get blocked on IMDb?

A request with the library's default user agent and no browser headers looks automated, and IMDb's conditions forbid robots without permission. If IMDb refuses your requests, check that your use is covered by the datasets or IMDb's permission before you continue.

What's the rate limit for scraping IMDb?

IMDb grants no scraping allowance: its conditions forbid robots without its written permission, so the pace is whatever IMDb agrees to. Without permission, the daily dataset files are the route for bulk data.

Do I need an account to get IMDb data?

No for the datasets: they download from datasets.imdbws.com without signing in. A scraper should never sign in, and lists or ratings tied to an account are not public data.

Can I get IMDb data for a specific country?

Yes: title.akas lists each title's local names by region and language. Release dates and titles on the pages can differ by the visitor's country, and ProxyField residential proxies target country, region and city across 412M+ IPs in 195+ countries.

How do I get structured JSON from IMDb?

Convert the dataset TSV rows to JSON, one record per tt ID, which needs no scraping. On a page you may fetch, the application/ld+json block is already JSON with name, rating, votes, genres, director and actors.

Which programming languages can I use to get IMDb data?

Any language that reads gzip and tab-separated files handles the datasets: Python, Node.js, Go, Java, PHP or Ruby. A scraping API is called the same way from each.

Can I try an IMDb scraper before paying for volume?

For the API, contact sales with the pages and volume you need; you are billed only for successful results. To test your own scraper, start with the Easy Trial: 1 GB of residential traffic for $2.95, with no subscription, and the traffic never expires.

What does IMDb's robots.txt allow?

IMDb's robots.txt at imdb.com/robots.txt lists the paths closed to crawlers; read it and leave those paths alone. It is separate from the conditions of use, which forbid scraping without IMDb's written permission whatever robots.txt allows.

Collect IMDb or Use IMDb Datasets pages with the Web Scraping API

Billed on successful results only. Contact sales for the Web Scraping API and the volume you need, or run your own scraper on residential proxies. 24/7 live chat helps with setup and integration.