使用 Python 抓取 IMDb:真正可用的代码

最后更新于 April 16, 2026

如果你最近搜过“scrape IMDb with Python”,大概率会有一个很明显的感受:现在能找到的大多数教程,基本都已经不能用了。不是那种“有点过时”的程度,而是那种“跑起来全是 0 结果,还一路报 NoneType 错误”的彻底失效。

过去几周,我把能找到的主流 IMDb 抓取教程几乎都实测了一遍——GeeksforGeeks、Medium、freeCodeCamp、Kaggle notebooks,能看的我都看了。在 里,大多数还在用 td.titleColumntd.ratingColumn 这类 CSS 选择器,但这些东西自从 IMDb 在 2023 年 6 月重做 Top 250 页面之后就已经没了。结果就是:论坛里一堆开发者都在问“为什么代码返回空结果?”,像 的维护者也只能承认:“除了把每个解析器都修一遍,我们也没别的办法。”这篇指南会讲两种目前真正还能用的 Python 方法,教你怎么处理分页和常见报错,什么时候 Python 其实不是最优解,以及怎么让你的爬虫尽量扛得住页面变化,不至于很快报废。

用 Python 抓取 IMDb 是什么意思?

网页抓取,简单说就是用程序从网页里提取数据——不用手动复制粘贴,而是写脚本替你干活。说到“抓取 IMDb”,意思就是用 Python 从 IMDb 网页里提取结构化电影数据,比如片名、评分、类型、演员、片长和投票数。

Python 里最常见的组合是三个库:requests(请求网页)、BeautifulSoup(解析 HTML 并定位数据)、pandas(整理和导出结果)。有些教程还会用 SeleniumPlaywright 去处理需要 JavaScript 渲染的页面,不过你会发现,其实还有更快、更省事的办法。

这里有个很重要的提醒:本指南里的所有内容,都已经按照 IMDb 截至 2025 年中期的当前页面结构验证过。IMDb 大概每 6–12 个月就会改一次页面,所以如果你是在 2027 年读这篇文章,某些选择器可能已经变了。(我后面也会讲怎么应对这种情况。)

为什么要用 Python 抓取 IMDb?真实场景有哪些?

在写第一行代码之前,先想清楚:你到底要拿 IMDb 数据做什么?答案取决于你是谁。

IMDb 影评数据集是全球最常用的 NLP 基准之一——Maas 等人 2011 年的奠基论文已经有了 ,而且这个数据集已经内置到 TensorFlow、Keras 和 PyTorch 里。在 Hugging Face 上,stanfordnlp/imdb 数据集每月有 213,321 次下载,已经被用来训练 1,500 多个模型。所以如果你做机器学习,那你大概率早就接触过 IMDb 数据了。

但它的用途远不止学术研究:

应用场景适用人群需要的数据字段
电影推荐引擎数据科学家、爱好者片名、类型、评分、演员
流媒体平台内容策略产品团队、内容团队评分、投票数、上映年份、类型
情感分析 / NLP 训练机器学习研究者、学生评论、评分
竞品内容分析娱乐行业分析师票房、上映日期、评分趋势
影视旅游研究旅游局、旅行公司拍摄地点、人气指标
学术研究高校研究人员任意结构化电影元数据

单是影视旅游市场,预计到 2025 年全球规模就会达到 。Netflix 在 2024 年的内容支出超过 170 亿美元,而 都是由个性化推荐带动的。也就是说,IMDb 数据真的会影响很多行业的决策。

在写代码之前,你可以怎样获取 IMDb 数据?

这部分通常是大多数教程直接跳过的。他们一上来就让你 pip install beautifulsoup4,却没先问:你的场景到底适不适合用 Python 抓取?

下面是完整选项:

方式最适合优点缺点
Python + BeautifulSoup学习、定制化提取控制力强、灵活选择器脆弱,经常失效
JSON-LD / __NEXT_DATA__ 提取希望稳定性的开发者能处理 JS 内容,更耐用需要理解 JSON 结构
IMDb 官方数据集大规模分析、学术用途合法、完整、2600 万+ 条目、每日更新TSV 格式,没有评论/图片
Cinemagoer(IMDbPY)库按条目程序化查询Python 风格 API、字段丰富88 个未解决问题,最新发布还是 2023 年 5 月
TMDb API电影元数据 + 图片免费 API key、JSON 格式、文档完善数据源不同(不是 IMDb 评分)
Thunderbit(无代码)不写代码的人、快速导出两步抓取、AI 自动建议字段、可导出到 Excel/Sheets大规模抓取需要消耗积分

这些方案有几点要说明。Cinemagoer 自 2023 年 5 月后就没有在 PyPI 上更新过版本,而且 IMDb 在 2025 年 6 月重做页面后,它的大多数解析器都坏了——现在并不适合生产环境。TMDb 很不错,但它用的是自己的评分体系,不是 IMDb 的。至于 IMDb 官方企业 API,如果通过 AWS Data Exchange 购买,一年要 ,对大多数人来说根本不现实。

如果你根本不想写代码, 可以直接读 IMDb 页面,自动建议提取字段(片名、评分、年份、类型),然后两步导出到 Excel、Google Sheets、Airtable 或 Notion。IMDb 页面布局一变,AI 也会跟着适配,所以你不用维护任何选择器。后面我会详细讲。

如果你想写 Python,下面这两种方法现在都能用。

方法 1:用 BeautifulSoup 抓取 IMDb(传统做法)

这是你在大多数教程里都会看到的经典方案。它确实能用,但我得先说明:在我介绍的几种方法里,它是最脆弱的。IMDb 的 CSS 类名很多都是自动生成的,页面一重设计就会变。不过,如果你的目标是学习网页抓取基础,这仍然是最好的入门方式。

第 1 步:安装并导入 Python 库

你需要四个包:

1pip install requests beautifulsoup4 pandas lxml

它们分别负责什么:

  • requests —— 发送 HTTP 请求,获取网页内容
  • beautifulsoup4 —— 解析 HTML,方便你查找特定元素
  • pandas —— 把提取的数据整理成表格,并导出为 CSV/Excel
  • lxml —— 高速 HTML 解析器(BeautifulSoup 可以把它当后端用)

导入代码如下:

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

第 2 步:向 IMDb 发送 HTTP 请求

很多新手第一次卡住就在这里。IMDb 会拦截没有正确 User-Agent 请求头的请求——你会收到 403 Forbidden 错误。Python Requests 默认的 user-agent(python-requests/2.31.0)基本一眼就会被识别出来。

1url = "https://www.imdb.com/chart/top/"
2headers = {
3    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
4    "Accept-Language": "en-US,en;q=0.9"
5}
6response = requests.get(url, headers=headers)
7if response.status_code != 200:
8    print(f"Failed to fetch page: {response.status_code}")
9else:
10    print("Page fetched successfully")

Accept-Language 这个请求头也很关键——如果不加,IMDb 可能会根据你 IP 的地理位置返回不同语言的内容。

第 3 步:用 BeautifulSoup 解析 HTML

拿到 HTML 后,创建一个 BeautifulSoup 对象,然后开始找目标元素。你可以在 Chrome 里打开 IMDb Top 250 页面,右键点击电影标题,选择“检查(Inspect)”查看底层 HTML 结构。

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

截至 2025 年中期,Top 250 页面使用的选择器是:

  • 电影容器li.ipc-metadata-list-summary-item
  • 标题h3.ipc-title__text
  • 年份span.cli-title-metadata-item(第一个 span)
  • 评分span.ipc-rating-star--rating

要注意,这些以 ipc- 开头的类名来自 IMDb 的组件系统。它们自 2023 年 6 月改版后一直比较稳定,但并不保证以后不会再变。

第 4 步:提取电影数据(标题、年份、评分)

这里我和很多教程不太一样:我加了 try/except 错误处理。我看过的很多教程都没做这一步,这也是它们在选择器变化时会悄悄崩掉的原因。

1movies = []
2movie_items = soup.select("li.ipc-metadata-list-summary-item")
3for item in movie_items:
4    try:
5        title_tag = item.select_one("h3.ipc-title__text")
6        title = title_tag.text.strip() if title_tag else "N/A"
7        year_tag = item.select_one("span.cli-title-metadata-item")
8        year = year_tag.text.strip() if year_tag else "N/A"
9        rating_tag = item.select_one("span.ipc-rating-star--rating")
10        rating = rating_tag.text.strip() if rating_tag else "N/A"
11        movies.append({
12            "title": title,
13            "year": year,
14            "rating": rating
15        })
16    except Exception as e:
17        print(f"Error parsing movie: {e}")
18        continue
19print(f"Extracted {len(movies)} movies")

第 5 步:用 Pandas 保存为 CSV 或 Excel

1df = pd.DataFrame(movies)
2df.to_csv("imdb_top_250.csv", index=False)
3df.to_excel("imdb_top_250.xlsx", index=False)
4print(df.head())

示例输出:

1                          title  year rating
20  1. The Shawshank Redemption  1994    9.3
31           2. The Godfather    1972    9.2
42     3. The Dark Knight        2008    9.0
53  4. The Godfather Part II     1974    9.0
64         5. 12 Angry Men       1957    9.0

这样确实能跑通。但它依赖的 CSS 选择器随时都可能失效——这也是为什么我更推荐下面这个方法。

方法 2:JSON-LD 技巧——完全跳过 HTML 解析

这是几乎没有竞品文章会提到的办法,也是我在正式项目里会优先用的方案。IMDb 会在每个页面的 <script type="application/ld+json"> 标签里嵌入结构化数据,也就是 (Linked Data 的 JSON 表达形式)。这套数据遵循 Schema.org 标准,Google 也会用它来生成丰富搜索结果,而且它比 CSS 类名稳定得多。

生产级工具 Apify IMDb Scraper 的提取优先级就是:“JSON-LD > NEXT_DATA > DOM”。我也建议你按这个顺序来。

为什么 JSON-LD 比 CSS 选择器更可靠?

方式支持 JavaScript 内容?能抗 UI 改版吗?速度复杂度
BeautifulSoup + CSS 选择器❌ 否⚠️ 脆弱(类名会变)
JSON-LD 提取✅ 是✅ 遵循 Schema.org 标准低-中
__NEXT_DATA__ JSON 提取✅ 是✅ 相对稳定低-中
Selenium / Playwright✅ 是⚠️ 脆弱中-高
Thunderbit(无代码,2 步)✅ 是(AI 直接读取页面)✅ AI 自动适配

ipc-metadata-list-summary-item 这种 CSS 类名,是 IMDb 的 React 组件系统自动生成的,每次重设计都可能变化。JSON-LD 对应的是实际数据模型,而不是页面展示层。它们之间的区别,就像“看一本书的目录”跟“靠字号猜章节”一样。

css-selectors-vs-json-ld.webp

一步一步:从 JSON-LD 提取 IMDb 数据

第 1 步:抓取页面

和前面一样,使用带正确 User-Agentrequests

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

第 2 步:找到 JSON-LD 的脚本标签

1script_tag = soup.find("script", {"type": "application/ld+json"})
2if not script_tag:
3    print("No JSON-LD found on this page")
4else:
5    data = json.loads(script_tag.string)
6    print(f"Found JSON-LD with type: {data.get('@type', 'unknown')}")

第 3 步:解析结构化数据

在 Top 250 页面里,JSON-LD 包含一个 itemListElement 数组,里面有全部 250 部电影。每个条目都包括排名、名称、URL、aggregateRating、上映日期、类型、简介、导演和演员数组。

1movies = []
2for item in data.get("itemListElement", []):
3    movie = item.get("item", {})
4    rating_info = movie.get("aggregateRating", {})
5    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    })

第 4 步:导出为 CSV

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

示例输出:

1   rank                      title                                     url  rating  vote_count date_published              genre
20     1  The Shawshank Redemption  https://www.imdb.com/title/tt0111161/     9.3     2900000     1994-10-14     Drama
31     2            The Godfather   https://www.imdb.com/title/tt0068646/     9.2     2000000     1972-03-24     Crime, Drama
42     3          The Dark Knight   https://www.imdb.com/title/tt0468569/     9.0     2800000     2008-07-18     Action, Crime, Drama

一次就能拿到 250 部电影。数据干净、结构清晰,不需要跟 CSS 选择器斗智斗勇。更重要的是,这些数据遵循 Schema.org 标准(Google 搜索结果也依赖它),所以比页面的视觉布局稳定得多。

额外技巧:用 __NEXT_DATA__ 抓取单个电影页

如果你想从单部电影详情页拿到更丰富的数据(片长、完整演员表、剧情简介、海报图等),IMDb 还会嵌入一个 __NEXT_DATA__ JSON 对象。这就是 React 用来 hydrate 页面所需要的数据,不能随便删,不然网站会坏。

1# 在单个电影页,例如 /title/tt0111161/
2next_data_tag = soup.find("script", {"id": "__NEXT_DATA__"})
3if next_data_tag:
4    next_data = json.loads(next_data_tag.string)
5    above_fold = next_data["props"]["pageProps"]["aboveTheFoldData"]
6    title = above_fold["titleText"]["text"]
7    year = above_fold["releaseYear"]["year"]
8    rating = above_fold["ratingsSummary"]["aggregateRating"]
9    runtime_seconds = above_fold.get("runtime", {}).get("seconds", 0)
10    genres = [g["text"] for g in above_fold["genres"]["genres"]]
11    plot = above_fold["plot"]["plotText"]["plainText"]

列表页用 JSON-LD,单个详情页用 __NEXT_DATA__。这才是生产级做法。

为什么你的 IMDb 爬虫总是坏掉?怎么修?

这是我查过的每一个 IMDb 抓取论坛里被提到最多的问题。用户会写:“代码因为 UI 变化坏掉了”或者“2024 年开始就不能用了!”,而回复通常不是沉默,就是一句“试试 Selenium”。

根本原因在于 IMDb 正在持续迁移到 React/Next.js 前端。下面是几个关键的破坏性改版时间线:

时间发生了什么变化哪些内容失效了
2022 年 11 月姓名页面重设计旧的姓名页爬虫
2023 年 6 月Top 250 页面重设计所有 td.titleColumn / td.ratingColumn 选择器
2023 年 4 月电影详情子页面重设计简介、奖项、新闻爬虫
2023 年 10 月高级搜索页重设计基于搜索结果的爬虫
2025 年 6 月/reference 页面重设计Cinemagoer 库(大多数解析器)

也就是说,差不多每 6–12 个月就会来一次大规模失效。如果你的爬虫依赖 CSS 类名,那你其实一直是在追着变化跑。

常见错误以及修复方式

结果为空 / NoneType 报错

这是最常见的问题。你会看到 AttributeError: 'NoneType' object has no attribute 'text'。这说明 BeautifulSoup 没找到你想要的元素——通常是 CSS 类名变了,或者内容是由 JavaScript 渲染的。

修复方法:改用 JSON-LD 提取(上面的第 2 种方法)。这些数据已经包含在初始 HTML 响应里,不需要 JavaScript。

403 Forbidden

IMDb 使用 来识别和拦截机器人。最常见的触发原因是缺少 User-Agent 请求头,或者这个请求头明显是伪造的。这一点在 开源项目和 里都有提到,甚至有 IMDb 员工承认过这个问题。

修复方法:始终使用真实浏览器风格的 User-Agent 字符串,并加上 Accept-Language: en-US。同时使用 requests.Session() 复用连接。

只返回 25 条结果

IMDb 的搜索页和“Most Popular”榜单使用了懒加载——初始只渲染大约 25 条结果,其余内容会在你滚动时通过 AJAX 加载。

修复方法:使用 URL 参数分页(下一节会讲),或者直接切到 Top 250 页面,因为它会一次性返回全部 250 部电影。

选择器突然失效

下面这些旧选择器已经不能用了:td.titleColumntd.ratingColumn.lister-item-header.inline-block.ratings-imdb-rating。如果你的代码还在用它们,那它已经坏了。

修复方法:优先使用 data-testid 属性(例如 h1[data-testid="hero-title-block__title"]),不要再依赖自动生成的类名。更好的办法是直接用 JSON-LD。

一个决策框架:短期修复 vs. 长期修复

  • 快速修复:在每个选择器外面加 try/except,校验 HTTP 状态码,记录错误而不是直接崩溃
  • 中期修复:从 CSS 选择器切换到 JSON-LD 提取(方法 2)
  • 长期修复:如果要做大规模分析,用 ,或者用像 这样的工具,它会在每次抓取时重新读取页面结构——不用维护选择器,AI 会自动适配布局变化

超越 25 条结果限制:IMDb 分页和大规模数据集怎么抓?

我看过的每个竞品教程都只抓了一页,没人讲分页。但如果你需要的不止一小段列表,很快就会碰到瓶颈。

不需要分页的页面

好消息是:Top 250 页面会在一次服务端响应里加载完整的 250 部电影。JSON-LD 和 __NEXT_DATA__ 里都包含了完整数据集,不需要分页。

IMDb 搜索分页是怎么工作的?

IMDb 搜索页使用 start= URL 参数,每次递增 50:

1https://www.imdb.com/search/title/?groups=top_1000&start=1
2https://www.imdb.com/search/title/?groups=top_1000&start=51
3https://www.imdb.com/search/title/?groups=top_1000&start=101

下面是一个遍历结果页的 Python 循环:

1import time
2all_movies = []
3for start in range(1, 1001, 50):  # 遍历 top 1000
4    url = f"https://www.imdb.com/search/title/?groups=top_1000&start={start}"
5    response = requests.get(url, headers=headers)
6    if response.status_code != 200:
7        print(f"Failed at start={start}: {response.status_code}")
8        break
9    soup = BeautifulSoup(response.text, "lxml")
10    # 用你喜欢的方法提取电影数据
11    # ...
12    print(f"Scraped page starting at {start}")
13    time.sleep(3)  # 礼貌一点——IMDb 大约会在 50 次快速请求后开始封禁

这个 time.sleep(3) 很重要。社区反馈显示,IMDb 大约在 50 次快速请求后会开始封 IP。每次请求之间随机停 2–5 秒,会更稳一点。

什么时候干脆别抓,直接用 IMDb 官方批量数据集?

如果你真的需要大规模数据,IMDb 在 提供了 7 个免费的 TSV 文件,每天更新:

文件内容大小
title.basics.tsv.gz片名、类型、类型标签、片长、年份~800 MB
title.ratings.tsv.gz平均评分、投票数~25 MB
title.crew.tsv.gz导演、编剧~300 MB
title.principals.tsv.gz主要演员/主创~2 GB
title.akas.tsv.gz各地区别名~1.5 GB
title.episode.tsv.gz电视剧集信息~200 MB
name.basics.tsv.gz人物:姓名、出生年份、代表作~700 MB

把它们读进 Pandas 很简单:

1ratings = pd.read_csv("title.ratings.tsv.gz", sep="\t", compression="gzip")
2basics = pd.read_csv("title.basics.tsv.gz", sep="\t", compression="gzip", low_memory=False)
3# 按 tconst(IMDb 片目 ID)合并
4merged = basics.merge(ratings, on="tconst")
5top_movies = merged[merged["titleType"] == "movie"].nlargest(250, "averageRating")

这些数据集覆盖 2600 万+ 条目。没有分页、没有选择器,也没有 403 错误。许可只限个人和非商业用途——你不能重新发布或转售这些数据。

无代码捷径:Thunderbit 帮你处理分页

如果你需要抓取带分页的 IMDb 数据,但又不想自己写分页逻辑, 原生支持点击分页和无限滚动。你只要告诉它要抓什么,剩下的它来做——包括自动滚动加载懒加载内容。

用 Python 抓取 IMDb:完整可运行代码(可直接复制)

下面给你两段可以直接运行的独立脚本。

脚本 A:BeautifulSoup 方案(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"Error: {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"Skipping movie due to error: {e}")
28df = pd.DataFrame(movies)
29df.to_csv("imdb_top250_bs4.csv", index=False)
30print(f"Saved {len(df)} movies")
31print(df.head())

脚本 B:JSON-LD 方案(推荐)

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"Error: {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("No JSON-LD data found")
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"Saved {len(df)} movies")
42print(df.head())

这两个脚本都带了错误处理,而且会输出干净的 CSV。脚本 B 能拿到更丰富的数据——导演、简介、URL——同时也更能抗页面改版。

不写代码也能抓 IMDb:用 Thunderbit

并不是每个人都想写 Python。也许你是做运营分析的,只想把本周评分最高的电影导进表格;也许你是内容策略人员,想比较不同年份的类型趋势。在这些情况下,自己写爬虫就有点大材小用了。

获取同样数据的方法如下:

开始前准备:

  • 难度: 初级
  • 耗时: 约 2 分钟
  • 你需要: Chrome 浏览器、(免费版可用)

第 1 步: 打开你想抓取的 IMDb 页面。在 Chrome 中打开 IMDb Top 250(或任何其他 IMDb 列表/搜索页)。

第 2 步: 在 Thunderbit 侧边栏点击“AI Suggest Fields”。AI 会扫描页面并推荐列名——通常会包括标题、年份、评分、类型,以及根据页面情况出现的其他字段。你会看到一个带推荐字段的预览表。

第 3 步: 按需调整字段。删掉不需要的列,或者点“+ Add Column”并用自然语言描述你想要的内容(比如“导演名称”或“投票数”)。

第 4 步: 点击“Scrape”。Thunderbit 会开始提取数据。对于无限滚动或分页页面,它会自动处理滚动。

第 5 步: 导出。点击导出按钮并选择格式——Excel、Google Sheets、CSV、Airtable 或 Notion。数据会在几秒内进入你的目标工具。

这里最关键的优势不只是省事,而是 Thunderbit 的 AI 每次都会重新读取页面结构。IMDb 改版时(它一定会改),AI 也会自动适配。没有选择器要更新,也没有代码要修。对任何经历过在截止日前夜 2 点爬虫突然坏掉的人来说,这种价值真的很大。

Thunderbit 还支持子页面抓取——你可以点进每部电影详情页,把演员、导演、片长和其他列表页看不到的字段补进表格。如果你想看实际演示,可以去看

抓取 IMDb 合法吗?你需要知道这些

很多人会直接在论坛里问:“这种做法合法吗?IMDb 应该不想让别人抓它的网站吧。”这是个合理问题,而且几乎没有竞品文章会认真回答。

IMDb 的 robots.txt:Top 250 榜单(/chart/top/)、单个电影页(/title/ttXXXXXXX/)和人物页(/name/nmXXXXXXX/)都没有被 robots.txt 禁止。被屏蔽的路径包括 /find/_json/*/search/name-text/user/ur*/ratings 以及一些 AJAX 端点。文件里没有写 Crawl-delay

IMDb 使用条款:相关条款写的是:“除非获得我们的明确书面同意,否则你不得在本网站上使用数据挖掘、机器人、屏幕抓取或类似的数据收集和提取工具。” 另有条款禁止转售或商业化使用抓取到的数据。

这在实践中意味着什么:2024 年的几个新判例(Meta v. Bright Data、X Corp v. Bright Data)认为,如果用户从未同意过条款,那么服务条款未必能约束这些用户——如果你抓的是公开可访问、无需登录的数据,ToS 的可执行性其实还有争议。不过,这仍然是一个不断变化的法律领域。

更稳妥的替代方案:IMDb 的 明确允许个人和非商业用途。TMDb 的 API 只要免费 key 就能合法调用。如果你想尽量合规,这两者都很不错。

实用建议:如果你确实要抓,请控制频率(每次请求之间 time.sleep(3))、设置正确请求头,并且不要访问 robots.txt 明确禁止的路径。商业项目最好咨询法律专业人士,或者直接使用官方数据集/API。

我们在 Thunderbit 博客里也专门讲过

结论:用对方法,Python 抓 IMDb 并不难

简单总结一下:

  • BeautifulSoup + CSS 选择器:适合学基础,但大概率每 6–12 个月就会失效一次。一定要加错误处理。
  • JSON-LD 提取:我最推荐给持续进行中的 Python 项目。它遵循 Schema.org 标准,比 CSS 类名稳定得多,而且不需要 JavaScript 渲染就能拿到干净的结构化数据。
  • __NEXT_DATA__ JSON:适合补充单个详情页的更丰富数据(片长、完整演员表、剧情、海报图)。
  • IMDb 官方数据集:适合大规模分析的最佳选择。2600 万+ 条目,每日更新,无需抓取。仅限个人/非商业用途。
  • :适合不写代码,或者想快速拿数据又不想维护代码的人。AI 可以自动适应布局变化,处理分页,并导出到 Excel/Sheets/Airtable/Notion。

建议把这篇指南收藏起来——IMDb 下次改结构时我会更新它。如果你想完全跳过代码, ,看看你能多快把 IMDb 页面变成一份干净的表格。如果你还会抓别的网站,我们关于 的指南也能帮你梳理更广泛的工作流。

试试适用于 IMDb 及更多网站的 AI 网页爬虫

常见问题

抓取 IMDb 合法吗?

IMDb 的使用条款禁止未经同意的抓取,但在 2024 年几起新的法院判决之后,针对公开可访问数据的 ToS 可执行性在法律上仍有争议。最稳妥的选择是使用 IMDb 的 (个人/非商业用途)或 TMDb API(免费 key)。如果你确实要抓取,请尊重 robots.txt、控制请求频率,并避开被屏蔽的路径。商业用途请咨询法律专业人士。

为什么我的 IMDb 爬虫返回空结果?

几乎总是因为 CSS 选择器过时了——像 td.titleColumntd.ratingColumn 这种类名自 2023 年 6 月后就不存在了。解决办法是改用 JSON-LD 提取(解析 <script type="application/ld+json"> 标签),或者把选择器更新为当前以 ipc- 开头的类名。同时也要确认你加了正确的 User-Agent 请求头,因为缺少这个请求头会触发 403 错误,看起来就像空结果。

怎样抓取 IMDb 上超过 25 条结果的数据?

Top 250 页面会一次性加载全部 250 部电影,不需要分页。对于搜索结果,请使用 start= URL 参数(每次加 50)翻页。例如:start=1start=51start=101。每次请求之间加 time.sleep(3),避免被封。或者直接使用 IMDb 的官方数据集 ,那里有 2600 万+ 条目,不需要分页。

什么是 __NEXT_DATA__,为什么要用它来抓 IMDb?

__NEXT_DATA__ 是一个嵌在 IMDb React/Next.js 页面 <script id="__NEXT_DATA__"> 标签里的 JSON 对象。它包含 React 用来渲染页面的完整结构化数据——标题、评分、演员、类型、片长等等。因为它反映的是底层数据模型,而不是视觉布局,所以它比 CSS 选择器更能抗 UI 改版。把它和 JSON-LD 配合使用,效果最稳。

不写代码也能抓 IMDb 吗?

可以。主要有两种方式:(1) 下载 IMDb 的 ——7 个 TSV 文件,覆盖 2600 万+ 条目,每天更新,免费供非商业用途使用。(2) 使用 ,它会读取 IMDb 页面,自动推荐提取字段,并在两步内导出到 Excel、Google Sheets 或 CSV——不用写代码,也不用维护选择器。

了解更多

Ke
Ke
CTO @ Thunderbit. Ke is the person everyone pings when data gets messy. He's spent his career turning tedious, repetitive work into quiet little automations that just run. If you've ever wished a spreadsheet could fill itself in, Ke has probably already built the thing that does it.
目录

试试 Thunderbit

只需 2 次点击即可抓取线索和其他数据。AI 驱动。

获取 Thunderbit 免费使用
使用 AI 提取数据
轻松将数据传输到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week