通过 REST 获取 IMDb 数据:简短回答

IMDb 没有免费的通用 REST API。其非商业数据集是可下载的文件,商业访问需要授权,因此当前条款请查阅其文档。如果你想用 IMDb ID 调用一个 HTTP 接口并得到 JSON,amodb 在付费套餐中提供这一能力。如果你的合同要求使用 IMDb 自己授权的数据,那份协议要与 IMDb 签订,amodb 无法替代。

在 amodb 上使用 IMDb ID 的方式

五种调用覆盖了大多数需求。每一种都从你已有的 ID 出发,或以一个 ID 作为结果。

你已有或想要调用得到
根据 IMDb ID 查作品GET /3/find/tt0137523?external_source=imdb_id数组 movie_results、tv_results、person_results
电影的 IMDb IDGET /3/movie/550,字段 imdb_id《搏击俱乐部》的 tt0137523
剧集的 IMDb IDGET /3/tv/1396/external_idsimdb_id,与 TVDB ID 并列
IMDb 评分GET /3/movie/550/ratingsimdb,包含 value 和 votes,或为 null
OMDb 风格的记录GET /omdb/?i=tt0137523imdbRating、imdbVotes、imdbID

每一行都使用同一个密钥。评分在评分页说明,ID 查找在按外部 ID 查找页说明。

读取 IMDb 评分

评分接口会同时返回分数和投票数。下面是《搏击俱乐部》(ID 550)的真实响应。分数会随时间变化。

JSON
{
  "id": 550,
  "imdb": {
    "value": 8.8,
    "votes": 2669989
  },
  "kinopoisk": {
    "value": 8.7,
    "votes": null
  },
  "metacritic": {
    "value": 67,
    "votes": null
  },
  "rotten_tomatoes": {
    "value": 81,
    "votes": null
  },
  "tmdb": {
    "value": 8.437,
    "votes": 33039
  }
}

对 IMDb 而言,value 采用 0 到 10 的刻度,保留一位小数。请在旁边显示投票数,当对象为 null 时什么都不要渲染。在这个响应中,只有 IMDb 和 TMDB 带有投票数。任何来源的 votes 都可能是 null,显示之前请先检查。缓存的响应在边缘节点有效 6 小时,所以更频繁地轮询没有收益。

功能对比

功能IMDbamodb
定价模式商业访问需授权,请查阅其文档预付,1 至 24 个月
免费额度没有免费的通用 REST API无,也没有试用
认证方式请查阅其文档api_key 查询参数或 Bearer 请求头
响应格式可下载的数据集文件,授权数据源请查阅其文档JSON
语言请查阅其文档14 种界面语言
电影字段请查阅其文档详情、演职员、图片、视频
电视剧字段请查阅其文档剧集、季、集
人物字段请查阅其文档资料、作品列表、图片
图片请查阅其文档img.amodb.dev,无需密钥
评分自有评分,访问方式请查阅其文档已知时提供五个来源,其中包括 IMDb
速率限制请查阅其文档每分钟 20、40 或 120 次请求
商业使用需授权,请查阅其文档付费套餐,见定价
兼容性自有格式,请查阅其文档TMDB v3 读取接口和 OMDb 协议

amodb 的不同之处

你调用的是接口,而不是解析文件。通过 append_to_response,一次请求就能返回作品及其演职员、预告片和评分,结构与 TMDB v3 一致,因此现有的客户端库可直接使用。同一个密钥也可用于 OMDb 风格的接口,让读取 imdbRating 的旧代码继续运行。

评分块是一个固定的对象,包含五个键。未知的来源为 null,而不是缺少键,因此读取 ratings.imdb 的代码不需要先检查上级对象是否存在。数值旁边可以有投票数,这样你可以隐藏只有少量投票支撑的评分。投票数也可能是 null,上面示例中五个来源里就有三个是这样。

IMDb 更适合的场景

  • 评分的源头。 IMDb 最先发布自己的评分。amodb 只在已知时返回数值,因此新作品或冷门作品可能返回 null。
  • 站点功能。 用户评论、列表和观看清单都在 IMDb 网站上。amodb 是元数据 API,不提供用户账户。
  • 授权数据。 如果合作方或合同要求使用 IMDb 授权的数据,只有 IMDb 能提供。
  • 离线分析。 非商业数据集文件适合在你自己的机器上进行批量研究。条款请查阅其文档。

迁移到 amodb

你很可能手上有一份 IMDb ID 列表。把每个 ID 映射到 amodb ID 一次,保存这一对,之后用数字 ID 调用详情。

bashpy
curl -s "https://api.amodb.dev/3/find/tt0133093?external_source=imdb_id" \
  -H "Authorization: Bearer $AMODB_KEY"
import os
import requests

KEY = os.environ["AMODB_KEY"]
imdb_ids = ["tt0137523", "tt0133093", "tt1375666"]

for imdb_id in imdb_ids:
    r = requests.get(
        f"https://api.amodb.dev/3/find/{imdb_id}",
        params={"external_source": "imdb_id"},
        headers={"Authorization": f"Bearer {KEY}"},
        timeout=10,
    )
    r.raise_for_status()
    hits = r.json()["movie_results"]
    print(imdb_id, hits[0]["id"] if hits else None)

上面三个 ID 分别映射到 550、603 和 27205,即《搏击俱乐部》《黑客帝国》和《盗梦空间》。像 tt0903747 这样的剧集 ID 会出现在 tv_results 中,《绝命毒师》的 ID 是 1396。返回空数组表示该 ID 没有找到匹配项。

请控制循环的节奏。每个 ID 是一次请求,429 响应包含 Retry-After 头,给出需要等待的秒数。其他错误码见错误。

安全地保存 ID

  • 把 IMDb ID 当作字符串保存。它们以 tt 开头并带有前导零,例如 tt0137523,而数字类型会丢掉这些零。
  • 把 IMDb ID 和 amodb ID 成对保存。任何一个都能再次找到这部作品。
  • 剧集读取 tv_results,电影读取 movie_results。一个 ID 通常只填充一个数组,其余保持为空。
  • 之后都用 amodb ID 请求详情,因为详情调用可以通过 append_to_response 带上演职员、预告片和评分。

定价

从每分钟 20、40 或 120 个请求的三个套餐中选择一个,并预付 1、3、6、12 或 24 个月。更长的周期可享受 10、20、30 或 40% 的折扣。所有套餐返回的数据相同,都不会自动续费,也没有免费额度。具体金额见定价。