Twitchデータをスクレイピングする方法:視聴者数、カテゴリ、スポンサーシップのシグナル

公式のHelix APIは取得できるデータを制限し、研究者が本当に欲しいデータを隠しています。TwitchのGraphQLエンドポイントから視聴者数、フォロワー総数、カテゴリのトレンドを取得する方法と、それを支えるプロキシについて解説します。

Twitchは公開データの宝庫です。ライブ視聴者数、カテゴリランキング、フォロワー総数、クリップ、ストリームタイトル、タグなど、マーケター、アナリスト、スポンサーシップスカウトが求めるデータが豊富にあります。しかし、公式のHelix APIはその一部を提供するだけで、レート制限があり、最も求められる指標(ゲームごとのフォロワー数や過去の視聴者トレンドなど)が欠けています。このガイドでは、APIが提供しないデータをどのように取得するか、Twitchのウェブエンドポイントからの取得方法、そしてスケジュールされたスクレイパーがブロックされないようにするプロキシ設定について説明します。

Helix APIが止まるところ

Helixは公式ルートであり、カバーされている範囲ではそれを優先すべきです。安定していて、ドキュメントがあり、ストリーム、ユーザー、ゲーム、クリップのクリーンなデータを返します。しかし、制限があります。アプリ登録とOAuthが必要で、ポイントバケット(デフォルトは1分あたり800ポイント)に対して計測され、一部の求められる情報を公開していません。「このゲームのトップチャンネルのフォロワー数は?」や「過去1時間の視聴者数の曲線を再構築する」などの質問はできません。あなたの質問がそのスキーマの外に出た瞬間、スクレイピングが必要になります。

Twitchをスクレイピングするということは、手作業ではなくコードを使って同じ公開データを取得することを意味します。ここでは、プライベートデータや認証されたページには触れません。ディレクトリ、カテゴリページ、訪問者が見ることができる公開チャンネルビューのみです。

公式Twitch Helix APIとGraphQLウェブエンドポイントをスクレイピングする際の比較図、レート制限と利用可能なフィールドを示す
Helixは安定していますが、キュレーションされており、レート制限があります。サイト自体が使用する公開GraphQLエンドポイントは、ログインなしでより多くのデータを返します。

最速の方法: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"])

1つのリクエストで表示名、フォロワー総数、チャンネルがライブの場合はストリームタイトル、現在の視聴者数、カテゴリが返されます。このフォロワー総数は、Helix APIが大規模に取得するのを難しくするフィールドであり、ここでは単一のクエリで取得できます。

チャンネルオブジェクトは基本を超えて豊富です。典型的なレコードには、数値のchannelIdloginスラッグと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スクレイピング用の住宅プロキシを入手

スケジュールされたTwitchモニターのフローダイアグラム:カテゴリディレクトリから住宅プロキシ、JSONスナップショット、15分ごとの時系列ストレージ
スケジュールされたスナップショットを回転する住宅IPを通じて行うことで、公開ディレクトリデータを視聴者トレンドとスポンサーシップシグナルに変えます。

ここで住宅プロキシが重要な理由

Twitchは大規模なプラットフォームのようにトラフィックを監視しています。15分ごとに1つのデータセンターIPから発信されるスケジュールされたスクレイパーは明らかなパターンであり、GraphQLエンドポイントはあなたをフラグするとエラーや空の結果を返し始めます。実際のISPからの住宅IPは通常の視聴者トラフィックに溶け込み、実行ごとに回転させることで、単一のアドレスがボットのように見えないようにリクエストを分散させます。地域に敏感な研究の場合、一部のカテゴリやクリップは地域によって異なる表示をするため、特定の国の出口も必要になります。200以上の国をカバーする住宅プールがそれを提供します。モバイルIPは最も攻撃的なターゲットに対して最強のオプションです。私たちのソーシャルプラットフォーム用プロキシガイドでは、それらを使用するタイミングを説明しています。

それを使って何ができるか

ユースケースはデータに従います。フォロワー数とカテゴリの存在感はインフルエンサーの発見とスポンサーシップのスカウトに役立ちます。キャンペーン前に適切なストリーマーを見つけ、正しくサイズを調整します。視聴者トレンドのスナップショットはゲーム業界の研究に役立ちます。どのタイトルが人気を集めているか、観客がピークに達するタイミング、ローンチが時間ごとにどのようにパフォーマンスするかを把握します。クリップとタイトルデータはコンテンツとトレンド分析をサポートします。商業的なTwitchスクレイパーはこのために千件あたり約5ドルを請求しますが、自分でプロキシを使用して実行すれば、パイプラインが整った後はその一部のコストで済み、生のデータを所有できます。同じスナップショットと差分のアプローチは、APIのクォータを超えたYouTubeデータの発掘など、他のプラットフォームガイドにも活用されています。

よくある質問

Twitchからデータをスクレイピングできますか?

はい、ストリームタイトル、視聴者数、フォロワー総数、カテゴリ、クリップなどの公開データはログインなしで表示され、コードで収集できます。Twitchのウェブクライアント自身が直接クエリできる公開GraphQLエンドポイントを使用しています。プラットフォームの利用規約を尊重し、プライベートデータや認証されたデータを避け、リクエストのペースを守りましょう。

なぜTwitch Helix APIを使わないのですか?

適合する場合はHelixを使用してください。公式で安定しています。しかし、OAuthが必要で、800ポイント/分のバケットで計測され、研究者が求めるフィールド(カテゴリに結びついたフォロワー数や分単位の視聴者履歴など)が省略されています。質問がそのスキーマの外に出た場合、公開ウェブエンドポイントをスクレイピングすることでギャップを埋めます。

Twitchをスクレイピングするのにプロキシは必要ですか?

一度限りのクエリには不要です。しかし、スケジュールされたものや大規模なものには必要です。単一のIPからの繰り返しパターンはフラグされ、エンドポイントはエラーや空のデータを返します。回転する住宅プロキシは、実際のISPアドレスにリクエストを分散させることで、モニターが完全な結果を返し続け、地域別のビューを引き出すことができます。

Twitchデータをどのくらいの頻度でスナップショットできますか?

視聴者トレンドの場合、10〜15分ごとが良いバランスです。日中の変化を確認するのに十分頻繁で、エンドポイントを過度に負担しません。間隔に小さなランダムジッターを追加し、各実行ごとに出口IPを回転させ、タイムスタンプを保存してトレンドを再構築できるようにします。間隔を狭めるとブロックのリスクが高まり、追加のシグナルはほとんど得られません。

Twitchの公開データはHelix APIが公開するものよりもはるかに豊富で、独自のGraphQLエンドポイントはフォロワー総数、視聴者数、カテゴリディレクトリ、クリップを単一のクエリでほとんど返します。それを丁寧なスケジュールで包み、回転する住宅IPを通じてルーティングすれば、公式APIが手の届かないトレンドやスポンサーシップシグナルを浮き彫りにするモニターが手に入ります。

QuantumProxiesでTwitchのスクレイピングを始めましょう