效率工具

用 Netflix 官方 Top 10 TSV 分析全球与地区榜单

用 Netflix Tudum 官方公开的 Top 10 数据文件(TSV)做两个小分析:一是各类别里“累计上榜周数”最多的作品;二是某个国家或地区最新一周的榜单。数据是 Netflix 自己公开发布的,不需要账号。

BINBHO · 图文教程

用 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 公开的数据里最容易拿到的一份,每周更新。用十几行代码就能回答“哪部作品在榜上待得最久”这类问题,不需要任何账号。