Статистика отсутствует на странице при первой загрузке.Страница отправляет запрос graphql на https://gql.twitch.tv/gql для получения игровых данных.Когда пользователь не вошел в систему, запрос graphql запрашивает запрос AnonFrontPage_TopChannels
.
Вот рабочий запрос на python:
import requests
import json
resp = requests.post(
"https://gql.twitch.tv/gql",
json.dumps(
{
"operationName": "AnonFrontPage_TopChannels",
"variables": {"platformType": "all", "isTagsExperiment": True},
"extensions": {
"persistedQuery": {
"version": 1,
"sha256Hash": "d94b2fd8ad1d2c2ea82c187d65ebf3810144b4436fbf2a1dc3af0983d9bd69e9",
}
},
}
),
headers = {'Client-Id': 'kimne78kx3ncx6brgo4mv6wki5h1ko'},
)
print(json.loads(resp.content))
Я включил Client-Idв запросе.Идентификатор не кажется уникальным для сессии, но я думаю, что Twitch истекает их, так что это, вероятно, не будет работать вечно.Вам нужно будет проверить будущие запросы graphql и в будущем получить новый Client-Id или выяснить, как программно очистить один из них со страницы.
Этот запрос фактически является разделом Top Live Channels.Вот как вы можете получить количество просмотров и заголовки:
edges = json.loads(resp.content)["data"]["streams"]["edges"]
games = [(f["node"]["title"], f["node"]["viewersCount"]) for f in edges]
# games:
[
("Let us GAME", 78250),
("(REBROADCAST) Worlds Play-In Knockouts: Cloud9 vs. Gambit Esports", 36783),
("RuneFest 2018 - OSRS Reveals !schedule", 35042),
(None, 25237),
("Front Page of TWITCH + Fortnite FALL SKIRMISH Training!", 22380),
("Reckful - 3v3 with barry and a german", 20399),
]
Вам нужно будет проверить Chrome Network Inspector и выяснить структуру других запросов, чтобы получить больше данных.
А вот пример для страницы каталога:
import requests
import json
resp = requests.post(
"https://gql.twitch.tv/gql",
json.dumps(
{
"operationName": "BrowsePage_AllDirectories",
"variables": {
"limit": 30,
"directoryFilters": ["GAMES"],
"isTagsExperiment": True,
"tags": [],
},
"extensions": {
"persistedQuery": {
"version": 1,
"sha256Hash": "75fb8eaa6e61d995a4d679dcb78b0d5e485778d1384a6232cba301418923d6b7",
}
},
}
),
headers={"Client-Id": "kimne78kx3ncx6brgo4mv6wki5h1ko"},
)
edges = json.loads(resp.content)["data"]["directoriesWithTags"]["edges"]
games = [f["node"] for f in edges]