如何抓取Twitch数据:观众、类别和赞助信号
官方的Helix API限制了你能获取的数据,并隐藏了研究人员真正想要的数据。以下是如何从Twitch自己的GraphQL端点获取观众人数、关注者总数和类别趋势的方法,以及保持其运行的代理。
Twitch拥有一座公共数据的金矿——实时观众人数、类别排名、关注者总数、剪辑、流标题和标签——这些都是营销人员、分析师和赞助侦察员所需的。问题在于,官方的Helix API只提供了经过策划的部分,有限制,并且缺少人们最常问的指标(如每个游戏的关注者数量或历史观众趋势)。本指南涵盖如何抓取其余部分:API不给你的东西,如何从Twitch自己的网络端点获取,以及保持计划抓取器不被阻止的代理设置。
Helix API的限制
Helix是官方认可的途径,你应该在它覆盖的地方优先使用:它稳定、文档齐全,并返回干净的数据用于流、用户、游戏和剪辑。但它有硬性限制。它需要应用注册和OAuth,限制你在一个点数桶中(默认是每分钟800点),并且它根本不公开一些人们想要的东西——你不能询问“这个游戏的顶级频道有多少关注者”或重建过去一小时的观众人数曲线。当你的问题超出其架构时,你就需要抓取。
抓取Twitch意味着用代码而不是手动提取同样的公共数据——你在网站上无需登录即可看到的数字。这里没有涉及私人数据或认证页面;只是目录、类别页面和任何访问者都能看到的公共频道视图。

快速路径:Twitch的GraphQL端点
Twitch自己的网络客户端使用网站JavaScript中附带的知名Client-ID与公共GraphQL端点通信。直接访问它是抓取最快、最轻量的方法:无需登录,无需无头浏览器,结构化的JSON直接返回。你发送一个带有公共Client-ID头的查询,一次调用即可获得流、观众人数、标签和剪辑。因为这是网站使用的相同API,它返回的正是访问者看到的——而且每次请求返回的内容远超过页面抓取。
import requests
PROXY = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": PROXY, "https": PROXY}
# public web Client-ID shipped in Twitch's own frontend
HEADERS = {"Client-ID": "kimne78kx3ncx6brgo4mv6wki5h1ko", "Content-Type": "application/json"}
query = {
"query": """
query($name: String!) {
user(login: $name) {
displayName
followers { totalCount }
stream { title viewersCount game { name } }
}
}""",
"variables": {"name": "somestreamer"},
}
r = requests.post("https://gql.twitch.tv/gql", json=query,
headers=HEADERS, proxies=proxies, timeout=15)
print(r.json()["data"]["user"])
一次请求返回显示名称、关注者总数,以及——如果频道正在直播——流标题、当前观众和类别。关注者总数正是Helix API在大规模获取时让人尴尬的字段,而在这里它是一个简单的查询。
频道对象的丰富性远超基础信息。一个典型记录包含数字channelId、login标识和displayName、简介描述、频道是否拥有合作伙伴状态,以及——对于直播频道——当前游戏、观众人数和流的标签。标签比看起来更重要:它们是你在为外展建立候选名单时按语言、地区或内容类型对主播进行细分的方式。对一组登录名执行相同查询,你就有了一个可比的数据集——关注者规模、合作伙伴状态、直播类别——一次通过,无需每个频道加载页面。
目录:类别和观众趋势
对于市场层面的信号——哪些游戏热门,观众在一天中的变化——类别目录是来源。有效的模式是以固定间隔快照一个类别页面(比如Just Chatting),并存储顶级流及其标题、主播和观众人数加上时间戳。每15分钟这样做一次,你就能构建观众趋势曲线和类别排名,这是官方API从未提供的。一个轻量级调度器和一个浏览器或GraphQL查询就足够了;关键在于间隔和存储,而不是获取。
import requests, time
from datetime import datetime, timezone
def snapshot_category(slug):
payload = {
"query": "query($slug: String!){ game(slug:$slug){ streams(first:30){ edges{ node{ title viewersCount broadcaster{ login } } } } } }",
"variables": {"slug": slug},
}
r = requests.post("https://gql.twitch.tv/gql", json=payload,
headers=HEADERS, proxies=proxies, timeout=15)
ts = datetime.now(timezone.utc).isoformat()
rows = []
for e in r.json()["data"]["game"]["streams"]["edges"]:
n = e["node"]
rows.append({"ts": ts, "login": n["broadcaster"]["login"],
"title": n["title"], "viewers": n["viewersCount"]})
return rows
# run on a schedule (e.g. every 15 min) and append to storage
while True:
save(snapshot_category("just-chatting"))
time.sleep(900)

为什么住宅代理在这里很重要
Twitch像任何大型平台一样监控流量。每15分钟从一个数据中心IP发出的计划抓取器是一个明显的模式,一旦被标记,GraphQL端点将开始返回错误或空结果。来自真实ISP的住宅IP混入正常观众流量中,并在每次运行时轮换它们以分散请求,这样没有一个地址看起来像机器人。对于位置敏感的研究——某些类别和剪辑在不同地区呈现不同——你还需要特定国家出口,而一个跨越200多个国家的住宅池可以提供这些。移动IP是针对最激进目标的最强选项;我们的社交平台代理指南涵盖了何时使用它们。
你可以用它构建什么
用例跟随数据。关注者数量和类别存在推动影响者发现和赞助侦察——在活动前找到合适的主播,正确地进行规模化。观众趋势快照为游戏行业研究提供数据:哪些游戏在增长,观众何时达到高峰,发布表现如何。剪辑和标题数据支持内容和趋势分析。商业Twitch抓取器每千个结果大约收费五美元;一旦你拥有了管道,自己运行并使用自己的代理成本只是其中的一小部分,而且你拥有原始数据。同样的快照和差异方法也推动了我们其他平台指南,如超越API配额挖掘YouTube数据。
常见问题
可以从Twitch抓取数据吗?
可以——无需登录即可看到的公共数据,如流标题、观众人数、关注者总数、类别和剪辑,可以通过代码收集。Twitch自己的网络客户端使用一个你可以直接查询的公共GraphQL端点。尊重平台的条款,避免私人或认证数据,并控制请求频率。
为什么不直接使用Twitch Helix API?
在适用的地方使用Helix——它是官方的且稳定。但它需要OAuth,限制你在每分钟800点的桶中,并省略了研究人员想要的字段,如与类别相关的关注者数量或逐分钟的观众历史。当你的问题超出其架构时,抓取公共网络端点可以填补空白。
抓取Twitch需要代理吗?
对于一次性查询,不需要。对于任何计划或大规模的操作,是需要的。从单个IP重复的模式会被标记,端点将返回错误或空数据。轮换住宅代理将请求分散到真实ISP地址上,以便你的监控继续返回完整结果,并让你获取特定地区的视图。
我可以多频繁地快照Twitch数据?
对于观众趋势,每10-15分钟是一个不错的平衡——足够频繁地看到日内变化而不对端点造成过大压力。为间隔添加小的随机抖动,每次运行时轮换出口IP,并存储时间戳以便重建趋势。更紧的间隔会增加你的阻止风险而信号增益有限。
Twitch的公共数据远比Helix API公开的丰富,其自己的GraphQL端点在单次查询中返回大部分数据——关注者总数、观众人数、类别目录、剪辑。将其包装在一个礼貌的计划中,通过轮换住宅IP路由,你就拥有了一个监控器,可以揭示官方API无法触及的趋势和赞助信号。