分国家看推特热榜:它到底怎么排的,以及怎么用代码拿到任意地区的榜单

20 min readSocialAPI 工程团队

分国家看推特热榜:它到底怎么排的,以及怎么用代码拿到任意地区的榜单

你侧边栏里那个热榜,不是"那个"热榜。它只是其中一个 —— 几百个里的一个,按 X 认为你在哪儿挑给你的。

这是关于热榜最容易被误解的一件事,而且它有实际后果。两个人在同一时刻看"推特上在热什么",看到的常常是真正不同的数据,而且两边都没错。

这篇讲清地区机制到底怎么运作、排名意味着什么和不意味着什么,以及怎么自己拉取任意地区的榜单。


热榜是分地区的,不是全球一份

X 为各个地区分别维护热榜 —— 全球、国家,以及很多单独的城市。每一份都由与该地关联的活动算出来。

在界面里你看到的是系统判定的你所在地区的榜单,这个可以改:更多 → 设置与隐私 → 内容偏好,关掉"为你推荐的趋势",然后手动选一个地区。

这在实践中意味着什么: 一个话题可以霸占某个国家的榜首,同时在邻国的榜上完全不存在。一条美国政治新闻可能在美国排第 1、在全球榜排第 12、在印度榜上根本没有。这三个数字里没有哪个是"真实"的那个。

★如果你是为工作追踪热榜,你查询的那个地区本身就是测量的一部分。★ 拿你从全球榜取的数字,去和别人从国家榜取的数字比,是在比两个不同的东西。(如果你需要精确说明自己指的是哪一个,全部 467 个地区都可以单独查询。)


"上热榜"到底衡量的是什么

这一点绊倒过很多人,值得说精确。

热榜衡量的是加速度,不是总量。 一个话题如果一直保持高讨论量 —— 某个足球俱乐部、某个大品牌 —— 可能永远上不了热榜,因为那个量对它来说是正常的。而一个从低基线陡然跃升的话题会立刻上榜,即使它的绝对量只有前者的一个零头。

这就是为什么你会看到一些没听过的东西排在明显更大的话题前面。排名不是"讨论最多",而更接近"当下讨论得最反常"。

两个值得内化的推论:

  • 大而稳的话题会被低估。 如果你在盯一个知名品牌,它不在热榜上不代表没人在讨论它。那种情况你需要的是关键词监控,而不是热榜。
  • 热榜衰减很快。 早上 9 点上榜的话题,常常中午就没了 —— 不是讨论停了,而是不再加速了。如果你一天只看一次,那天热过的东西你大部分都错过了。

⚠️ 那个数量数字(如果显示的话)不是总量。 有些条目会显示帖子数,很多条目什么都不显示。没有的时候不是出错,它本来就不是每条都公布。写代码时要按"它可能没有"来处理。


怎么正确地读一份热榜

光是五十个字符串的裸列表,本身用处不大。让它变得有用的是比较

跨时间比。 一次快照告诉你此刻在发生什么;一个序列才告诉你什么在上升。定时轮询、每份快照带时间戳存下来,你就能在一个话题触顶之前看到它在爬 —— 而这是这份数据唯一能提前指导行动的形态。

跨地区比。 同一个查询打到多个地区,能告诉你某件事是本地的还是全球的。只出现在一个国家榜上的话题是本地新闻;同时出现在十五个国家榜上的则完全是另一回事,而你在做出反应之前会想先知道自己面对的是哪一种

和你自己的基线比。 对任何持续关注的对象 —— 一个行业、一组竞品、一个话题领域 —— 重要的不是它有没有上榜,而是它比平时更热还是更冷。这需要历史,也就意味着要从现在开始收集。


用代码拿热榜

两个调用:一个拿可用地区列表,一个拿某地区的当前热榜。

import requests

BASE = "https://api.socialapi.tech"
KEY  = "your_api_key"
HDRS = {"X-API-Key": KEY}

def available_locations():
    """X 提供热榜的全部地区,以及各自的 WOEID。"""
    r = requests.get(f"{BASE}/v1/trends/locations", headers=HDRS, timeout=60)
    r.raise_for_status()
    return r.json()["data"]

def trends_for(woeid=1):
    """某个地区的当前热榜。woeid=1 是全球。"""
    r = requests.get(
        f"{BASE}/v1/trends/place",
        params={"woeid": woeid},
        headers=HDRS,
        timeout=60,
    )
    r.raise_for_status()
    return r.json()["data"]

locations = available_locations()
print(f"共 {len(locations)} 个地区可用")

world = trends_for(1)
print(f"截至 {world['as_of']}\n")

for i, trend in enumerate(world["trends"], 1):
    volume = trend.get("tweet_volume")
    suffix = f"  ({volume:,} 帖)" if volume else ""
    print(f"{i:>2}. {trend['name']}{suffix}")

返回的是什么: 每个地区返回固定 50 条热榜,外加一个 as_of 时间戳和它所属的地区信息。每条都有 name;tweet_volume 有的有、有的是 null,所以上面那个 .get() 不是多余的防御 —— 那才是常态

地区数:467 个,包含全球、各国以及很多单独城市。woeid=1 是全球;其余的从地区列表里查,不要硬编码 ID


同时对比多个国家

到这一步,它才从一个侧边栏小组件变成分析工具:

def compare(woeids):
    """哪些热榜话题是跨地区共享的,哪些是本地的?"""
    from collections import Counter

    seen = Counter()
    per_region = {}

    for name, woeid in woeids.items():
        data = trends_for(woeid)
        names = [t["name"] for t in data["trends"]]
        per_region[name] = names
        seen.update(names)

    print("出现在多个地区的:")
    for trend, count in seen.most_common():
        if count > 1:
            where = [r for r, ts in per_region.items() if trend in ts]
            print(f"  {trend:<30} {count} 个地区: {', '.join(where)}")

# WOEID 来自地区列表调用
compare({"全球": 1, "美国": 23424977, "印度": 23424848})

这回答了侧边栏答不了的问题:你看到的这件事,是全球性事件还是一条本地新闻。★ 而这个区分,通常直接决定了它值不值得回应。


两个必须说清楚的局限

热榜是快照,不是历史。 X 公布的是此刻在热什么。没有任何接口能返回"上周二热的是什么" —— 那段历史只有在当时有人记录的情况下才存在。如果你希望将来能回答关于过去热榜的问题,今天就要开始存快照。这里和归档推文是同一个不对称:往前既便宜又完整,往后则根本做不到。

排名方法没有公开。 X 没有公布位次是怎么算出来的,而且它明显不只是原始计数 —— 个性化、对近似话题的去重、以及某种过滤,看起来都参与其中。把位次当作信号,不要当作测量值。 任何声称知道确切公式的人都是在猜。


大家会问的问题

怎么看其它国家的推特热榜? 界面里:设置与隐私 → 内容偏好 → 关掉"为你推荐的趋势",然后选地区。代码里:查那个地区的 WOEID。

推特热榜是根据什么排的? 讨论量的陡增,不是总量。从低基线跃升的话题会上榜;一直很热闹的话题往往不会。

推特显示多少条热榜? 界面显示一个短列表,通常十条左右。底层的地区榜单是 50 条。

推特热榜多久更新一次? 持续更新 —— 是以分钟为单位在变,不是小时。一天看一次,会漏掉那天热过的大部分内容。

WOEID 是什么? "Where On Earth ID",一个地点的数字标识。1 是全球。其余的从地区列表拿,别硬编码

有多少个地区有热榜? 467 个,涵盖全球、各国和很多单独城市。

为什么某个话题在这个国家热、在那个国家不热? 因为榜单本来就是分地区算的。这是系统的设计,不是数据不一致。

能看历史热榜吗? 从 X 拿不到 —— 它只公布当前热榜。历史数据只存在于有人持续存过快照的地方。

热榜下面那个数字是什么意思? 显示时表示该话题的帖子数。它经常是没有的,这是正常现象而不是错误。

为什么我和同国家的另一个人看到的热榜不一样? 个性化。界面会把地区和你的兴趣混合,所以同一个城市的两个人可以看到不同的榜。按地区查询拿到的是未经个性化的那份。

怎么拿某个城市的热榜? 在地区列表里找到那个城市,查它的 WOEID。不是每个城市都有 —— 覆盖很广但不是全部。

能关掉个性化热榜吗? 能 —— 内容偏好 → 关掉"为你推荐的趋势",然后明确选一个地区。

一个话题能热多久? 常常不到几小时。因为热榜衡量的是加速度,增长一旦放平,即使讨论还在继续,话题也会掉下去

我的标签明明很多人发,为什么不上热榜? 多半是稳而不是在涨,或者它的量和同榜竞争的话题比太小。稳定的量很少能上榜。

能追踪一个话题什么时候开始上榜吗? 只能靠轮询并比较快照。没有任何推送会在话题进榜时通知你 —— 你是通过"这次轮询里出现了上次没有的条目"来发现的。

热榜和发帖最多的话题是一回事吗? 不是,这是最常见的误读。发帖最多是量,上热榜是量的变化。

怎么找热门话题标签? 它们就在同一份榜单里 —— 标签和普通短语都会上榜,榜单是混着的。

热榜能被操纵吗? 有组织地推某个话题是已知现象,X 也在对此采取措施。实践中,对反常条目保持一点怀疑,别把它当成纯自然信号。

热榜和搜索有什么区别? 热榜告诉你什么在升搜索告诉你你已经点名的那个东西,人们在怎么说。两个不同的问题。

怎么自动监控热榜? 对你关心的地区定时轮询,并把每份快照存下来。正是这个收集动作,把一份实时榜单变成了可分析的东西。

手机端和网页端的热榜一样吗? 底层数据一样;呈现方式和显示条数不同。

不登录能看热榜吗? 部分能看,有限制。不适合作为任何自动化的基础。

现在推特上最热的话题是什么? 就是你所在地区的热榜此刻显示的内容。"现在的推特热榜"和"当前热门话题"是持续变化的 —— 你早上 9 点截的图,到午饭时就过时了。

怎么看印度的推特热榜话题? 查印度的 WOEID,或在内容偏好里把地区设成印度。同样的方法适用于印度、巴基斯坦、美国,或 467 个地区中的任何一个。

为什么巴基斯坦的热榜和印度不一样? 因为热榜是按地区分别计算的。相邻国家之间经常几乎没有重叠 —— 这是设计,不是数据不一致。

美国现在在热议什么? 把美国的 WOEID 传给热榜调用。 ★不存在单一的"美国榜"★ —— 国家和它的各个主要城市各有各的

美国推特热榜是什么? 一份全国榜,加上分开的城市榜。一个话题可以登顶纽约却在全国榜上不存在★,这是正常的。

印度今天在热议什么? 同样的机制,不同的 WOEID。 印度的榜单是平台上最活跃的之一。

全球在热议什么? 全球榜是存在的,但★它由最大的几个语言社区主导★,很少反映任何一个具体用户的体验可选地区有数百个,每个都有自己的 WOEID。

怎么做一个热榜检测器? 定时读热榜端点。任何检测器做的就是这件事★ —— 价值在于把历史存下来

"今天在热议"和"现在在热议"有什么区别?端点只知道"现在"。"今天"要求你保存过更早的读数 —— 没有人会给你昨天的榜单

热门标签和热门话题是两回事吗? 同一份榜单里两者都有。 一个趋势就是任何正在加速的词,带不带标签都算。

热榜多久更新一次? 持续更新,量级在分钟。轮询频率要远低于此★ —— 榜单是共享的,而且被大量缓存。

一次返回多少条趋势? 每个地区大约五十条。 App 里看到的前十是被截断后的结果。

能看历史热榜吗?只能看你自己记录过的。平台只提供当前榜单,不为你保留任何存档。

为什么某个趋势在我 App 里没有,接口里却有? 你 App 里的榜单是个性化的;地区榜不是★。它们确实是两份不同的榜单。

能查某座城市的热榜吗? 如果那座城市有 WOEID 就能。主要城市有;更小的城市会回退到国家榜。

什么会让一个词上热榜?是加速度,不是体量。一个多年来被稳定使用的词永远不会上榜,不管它多大。

怎么长期追踪一个趋势? 按固定间隔轮询并存下每一次快照。 间隔必须恒定才有可比性。

能看到某个话题热了多久吗?只有全程采样过才行。持续时长是你测量出来的,不是取回来的。


如果你要基于它做东西

热榜本身就是一个调用。真正花工夫的是它周围的一切:对多个地区定时轮询、把快照存下来好有基线可比,以及处理 tweet_volume 经常为 null 这件事。

这正是我们的 API 覆盖的 —— 全部 467 个地区、每个 50 条,地区字典是单独一个调用,这样你就不用自己维护一张硬编码的 WOEID 表。固定按次价格,没有属于你的限流要管,而且是只读的:只读取公开数据,绝不对你的账号做任何操作。

有两种情况我们不收钱:请求还没发出去就被我们拒绝的,以及我方原因导致的错误。

延伸阅读:实时监控特定关键词 · 高级搜索操作符 · 衡量你找到的内容的互动表现