用 Netflix Tudum 官方公开的 Top 10 数据文件(TSV)做两个小分析:一是各类别里“累计上榜周数”最多的作品;二是某个国家或地区最新一周的榜单。数据是 Netflix 自己公开发布的,不需要账号。
先看清成品
本机下载了真实数据:
all-weeks-global.tsv(911,132 字节,2021-07-04 到 2026-10-18,4 个类别各 2,770 行)和all-weeks-countries.tsv(32,805,445 字节,覆盖 95 个国家/地区)。全球累计上榜周数最长的是 “KPop Demon Hunters”(英语电影,67 周)和 “Squid Game: Season 1”(非英语剧集,32 周)。查询 HK 的结果是截至 2026-10-18 那一周的榜单,第 1 名是 “Tomb Raider”。查询 CN 时提示数据里没有(Netflix 没有在中国大陆提供服务)。pytest 2 个测试通过。
注意:Netflix 没有面向公众的开放 API,本系列只用官方提供的功能和公开数据:账号里的观看记录导出、Tudum 的 Top 10 数据文件,以及 “What We Watched” 报告。不要爬取网站,不要绕过 DRM 或录屏,不要用 VPN 或代理切换地区,不要违反官方的家庭共享规则去共享账号(见“项目资源”里的帮助页面)。套餐价格以官方页面为准,本文不列数字。
做完之后你会得到什么?
| 成果 | 说明 |
|---|---|
top10.py global |
4 个类别各列出前 5 名(按累计周数) |
top10.py country XX |
某国家或地区最新一周的电影榜和剧集榜 |
| 版本区分 | 剧集按季统计(season_title),电影按片名统计 |
需要准备哪些环境?
| 项目 | 要求 | 说明 |
|---|---|---|
| Python | 3.8 以上 | 只用标准库 |
| 数据 | 从 Tudum Top 10 页面下载 | 文件会每周更新 |
文件结构
33-netflix-B-src/
├── top10.py
└── test_top10.py # 数据文件太大,不放进仓库,用的时候现下载
第 1 步:下载数据
curl -LO https://www.netflix.com/tudum/top10/data/all-weeks-global.tsv
curl -LO https://www.netflix.com/tudum/top10/data/all-weeks-countries.tsv
本机实测的表头:
all-weeks-global.tsv: week category weekly_rank show_title season_title weekly_hours_viewed runtime weekly_views cumulative_weeks_in_top_10
all-weeks-countries.tsv: country_name country_iso2 week category weekly_rank show_title season_title cumulative_weeks_in_top_10
国家数据只有排名,没有观看时长。
第 2 步:脚本
top10.py:
"""分析 Netflix Tudum 官方公开的 Top 10 数据(TSV)。
下载:https://www.netflix.com/tudum/top10 页面底部的数据文件,或直接:
https://www.netflix.com/tudum/top10/data/all-weeks-global.tsv
https://www.netflix.com/tudum/top10/data/all-weeks-countries.tsv
用法:
python top10.py global all-weeks-global.tsv # 各类别累计上榜周数最多的 5 部
python top10.py country all-weeks-countries.tsv HK # 某国家/地区最新一周的榜单"""
import csv, sys
from collections import defaultdict
def read(path):
with open(path, encoding="utf-8", newline="") as f:
yield from csv.DictReader(f, delimiter="\t")
def label(r):
return r["show_title"] if r["season_title"] in ("N/A", "") else r["season_title"]
def longest_runs(rows, n=5):
best = defaultdict(dict) # 类别 → {条目: 最大累计周数}
for r in rows:
k, w = label(r), int(r["cumulative_weeks_in_top_10"])
best[r["category"]][k] = max(w, best[r["category"]].get(k, 0))
return {c: sorted(d.items(), key=lambda x: (-x[1], x[0]))[:n] for c, d in sorted(best.items())}
def latest_country(rows, iso2):
rows = [r for r in rows if r["country_iso2"] == iso2.upper()]
if not rows: raise SystemExit(f"数据里没有 {iso2}(Netflix 只为提供服务的国家/地区发布榜单)")
week = max(r["week"] for r in rows)
out = defaultdict(list)
for r in rows:
if r["week"] == week: out[r["category"]].append((int(r["weekly_rank"]), label(r), int(r["cumulative_weeks_in_top_10"])))
return week, {c: sorted(v) for c, v in sorted(out.items())}
if __name__ == "__main__":
mode, path = sys.argv[1], sys.argv[2]
if mode == "global":
for cat, items in longest_runs(read(path)).items():
print(f"## {cat}")
for t, w in items: print(f" {w:>3} 周 {t}")
else:
week, cats = latest_country(read(path), sys.argv[3])
print(f"{sys.argv[3].upper()} · 截至 {week} 的一周")
for cat, items in cats.items():
print(f"## {cat}")
for rank, t, w in items: print(f" {rank:>2}. {t}(累计 {w} 周)")
第 3 步:测试和运行
test_top10.py:
import io, csv
from top10 import longest_runs, latest_country, label
G = [dict(category="TV (English)", show_title="A", season_title="A: Season 1", cumulative_weeks_in_top_10=w) for w in ("1", "2", "3")] + \
[dict(category="TV (English)", show_title="A", season_title="A: Season 2", cumulative_weeks_in_top_10="2"),
dict(category="Films (English)", show_title="F", season_title="N/A", cumulative_weeks_in_top_10="4")]
def test_longest():
r = longest_runs(G)
assert r["TV (English)"][0] == ("A: Season 1", 3) and r["Films (English)"] == [("F", 4)]
def test_country_latest_week():
rows = [dict(country_iso2="HK", week=w, category="Films", weekly_rank=k, show_title=t, season_title="N/A", cumulative_weeks_in_top_10="1")
for w, k, t in [("2026-10-11", "1", "Old"), ("2026-10-18", "2", "B"), ("2026-10-18", "1", "A")]]
week, cats = latest_country(rows, "hk")
assert week == "2026-10-18" and [x[1] for x in cats["Films"]] == ["A", "B"]
$ python top10.py global all-weeks-global.tsv
## Films (English)
67 周 KPop Demon Hunters
27 周 The Boss Baby
...
## TV (Non-English)
32 周 Squid Game: Season 1
30 周 Yo soy Betty, la fea: Season 1
...
$ python top10.py country all-weeks-countries.tsv HK
HK · 截至 2026-10-18 的一周
## Films
1. Tomb Raider(累计 1 周)
2. Animals(累计 2 周)
...
(以上是 2026-10-21 下载的数据,以后再下载结果会变。)
调试示例
查询 CN 没有结果
$ python top10.py country all-weeks-countries.tsv CN
数据里没有 CN(Netflix 只为提供服务的国家/地区发布榜单)
country_iso2 一共有 95 个取值,里面没有 CN。这是数据本身的情况,不是脚本出错。请分析你所在、并且 Netflix 在当地提供服务的地区;不要为了看别的地区的片库去切换地区。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 同一部剧出现多次 | 每一季分开上榜 | 正常现象;想要合并就改用 show_title |
| 数字和网页上的不一样 | 下载时间不同 | 记下下载日期 |
| 国家文件读得慢 | 文件有 30 多 MB | 先用 grep 过滤出要的国家 |
模板规则
- 只用官方公开的数据文件,并写明下载日期。
- 剧集按季统计,电影按片名统计。
- 某个地区没有数据,就如实说明。
项目资源
| 用途 | 地址 |
|---|---|
| Tudum Top 10 | https://www.netflix.com/tudum/top10 |
| 全球数据 TSV | https://www.netflix.com/tudum/top10/data/all-weeks-global.tsv |
| 使用 Netflix 的地区说明 | https://help.netflix.com/en/node/24853 |
| 使用条款 | https://help.netflix.com/legal/termsofuse |
Top 10 数据是 Netflix 公开的数据里最容易拿到的一份,每周更新。用十几行代码就能回答“哪部作品在榜上待得最久”这类问题,不需要任何账号。