Как собирать данные с Twitch: зрители, категории и сигналы спонсорства

Официальный Helix API ограничивает доступ к данным и скрывает информацию, которая действительно интересует исследователей. Вот как получить количество зрителей, общее число подписчиков и тренды категорий с собственного GraphQL-эндпоинта Twitch — и прокси, которые обеспечивают его работу.

Twitch располагает кладезем публичных данных — количество зрителей в реальном времени, рейтинги категорий, общее число подписчиков, клипы, названия стримов и теги — которые интересуют маркетологов, аналитиков и специалистов по спонсорству. Проблема в том, что официальный Helix API предоставляет лишь отфильтрованную часть этих данных, ограниченную по скорости и без метрик, которые наиболее востребованы (например, количество подписчиков по играм или исторические тренды зрителей). Это руководство объясняет, как собрать остальное: что API не предоставляет, как получить это с веб-эндпоинтов Twitch и как настроить прокси, чтобы планировщик сборщика не блокировался.

Где заканчивается Helix API

Helix — это санкционированный маршрут, и его следует предпочитать, когда он вас устраивает: он стабилен, документирован и возвращает чистые данные о стримах, пользователях, играх и клипах. Но у него есть жесткие ограничения. Требуется регистрация приложения и OAuth, он ограничивает вас по баллам (по умолчанию 800 баллов в минуту) и просто не предоставляет некоторые вещи, которые интересуют людей — вы не можете спросить его "сколько подписчиков у топового канала этой игры" или восстановить кривую количества зрителей за последний час. Как только ваш вопрос выходит за рамки его схемы, вы начинаете сбор данных.

Сбор данных с Twitch означает получение тех же публичных данных — чисел, которые вы видите на сайте без входа в систему — с помощью кода, а не вручную. Здесь нет доступа к приватным данным или аутентифицированным страницам; это каталог, страницы категорий и публичные просмотры каналов, которые видит любой посетитель.

Сравнительная диаграмма официального Twitch Helix API и сбора данных с веб-эндпоинта GraphQL, показывающая ограничения по скорости и доступные поля
Helix стабилен, но отфильтрован и ограничен по скорости; публичный GraphQL-эндпоинт, который использует сам сайт, возвращает более полные данные без входа в систему.

Быстрый путь: GraphQL-эндпоинт Twitch

Веб-клиент Twitch общается с публичным GraphQL-эндпоинтом, используя известный Client-ID, который поставляется в JavaScript сайта. Обращение к нему напрямую — это самый быстрый и легкий способ сбора данных: без входа в систему, без безголового браузера, структурированный 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

Диаграмма потока запланированного монитора Twitch: каталог категорий к резидентному прокси к снимку JSON к хранилищу временных рядов каждые 15 минут
Запланированный снимок через вращающиеся резидентные IP превращает данные публичного каталога в тренды зрителей и сигналы спонсорства.

Почему здесь важны резидентные прокси

Twitch отслеживает трафик, как и любая крупная платформа. Запланированный сборщик, работающий с одного IP-адреса дата-центра каждые 15 минут, — это очевидный шаблон, и GraphQL-эндпоинт начнет возвращать ошибки или пустые результаты, как только вас заметят. Резидентные IP от реальных интернет-провайдеров сливаются с обычным трафиком зрителей, и их вращение при каждом запуске распределяет запросы так, чтобы ни один адрес не выглядел как бот. Для исследований, чувствительных к местоположению — некоторые категории и клипы отображаются по-разному в зависимости от региона — вам также понадобятся выходы из конкретных стран, которые предоставляет резидентный пул из более чем 200 стран. Мобильные IP — это самый сильный вариант для самых агрессивных целей; наш гид по прокси для социальных платформ объясняет, когда их использовать.

Что можно построить с этим

Сценарии использования следуют за данными. Количество подписчиков и присутствие в категориях помогают в обнаружении инфлюенсеров и поиске спонсоров — нахождение подходящих стримеров перед кампанией, правильно подобранных по размеру. Снимки трендов зрителей питают исследования игровой индустрии: какие тайтлы набирают популярность, когда аудитория достигает пика, как проходит запуск по часам. Данные о клипах и названиях поддерживают анализ контента и трендов. Коммерческие сборщики данных с Twitch берут примерно пять долларов за тысячу результатов за это; выполнение этого самостоятельно с вашими собственными прокси стоит в разы дешевле, как только у вас есть канал, и вы владеете сырыми данными. Тот же подход со снимками и различиями лежит в основе наших других платформенных гидов, таких как добыча данных YouTube за пределами квоты API.

Часто задаваемые вопросы

Можно ли собирать данные с Twitch?

Да — публичные данные, такие как названия стримов, количество зрителей, общее число подписчиков, категории и клипы, видны без входа в систему и могут быть собраны с помощью кода. Веб-клиент Twitch использует публичный GraphQL-эндпоинт, к которому можно обращаться напрямую. Соблюдайте условия платформы, избегайте приватных или аутентифицированных данных и регулируйте частоту запросов.

Почему бы просто не использовать Twitch Helix API?

Используйте Helix, где он подходит — он официальный и стабильный. Но он требует OAuth, ограничивает вас по 800 баллам в минуту и исключает поля, которые интересуют исследователей, такие как количество подписчиков, привязанных к категориям, или история зрителей по минутам. Когда ваш вопрос выходит за рамки его схемы, сбор данных с публичных веб-эндпоинтов заполняет пробел.

Нужны ли прокси для сбора данных с Twitch?

Для разового запроса — нет. Для чего-то запланированного или масштабного — да. Повторяющийся шаблон с одного IP будет замечен, и эндпоинт начнет возвращать ошибки или пустые данные. Вращающиеся резидентные прокси распределяют запросы по адресам реальных интернет-провайдеров, чтобы ваш монитор продолжал возвращать полные результаты, и позволяют получать виды, специфичные для региона.

Как часто можно делать снимки данных Twitch?

Для трендов зрителей каждые 10-15 минут — это хороший баланс — достаточно часто, чтобы видеть внутридневные изменения, не перегружая эндпоинт. Добавьте небольшую случайную задержку к интервалу, вращайте ваш выходной IP при каждом запуске и сохраняйте временные метки, чтобы можно было восстановить тренды. Более частые интервалы увеличивают риск блокировки без значительного увеличения сигнала.

Публичные данные Twitch гораздо богаче, чем показывает Helix API, и его собственный GraphQL-эндпоинт возвращает большинство из них в одиночных запросах — общее число подписчиков, количество зрителей, каталоги категорий, клипы. Оберните это в вежливый график, направьте через вращающиеся резидентные IP, и у вас будет монитор, который выявляет тренды и сигналы спонсорства, которые официальный API держит вне досягаемости.

Начните сбор данных с Twitch с QuantumProxies