Как сканировать twitch.tv, где тело HTML было пустым при первоначальном запросе http, а содержимое загружалось различными скриптами
Я пытаюсь использовать Scrapy, чтобы ползти по потоковым страницам. Проблема в том, что запрос html не возвращает полезных URL. Например, с помощью wget на главной странице twitch.tv я получаю пустой тег body:
<body>
//some stuff
<div id='flyout'>
<div class='point'>
</div>
<div class='content'>
</div>
</div>
</body>
Я понимаю, что контент был каким-то образом загружен впоследствии, но не мог понять, как это было сделано. Есть идеи, предложения? Спасибо!!!
1 ответ
Откройте браузер с открытыми инструментами разработчика. Перейдите на вкладку "Сеть", затем перейдите к twitch.tv и погрузитесь во все запросы, чтобы увидеть, какие запросы предоставляют какие части содержимого, и сузить его до требуемого содержимого (и, учитывая приведенный ниже пример, URL-адрес запроса, скорее всего, будет запросом. в какой-то форме https://api.twitch.tv/{путь к конечной точке}/{имя конечной точки}?{endpointarg=value}). Например:
Если вы хотите получить все данные для показанного контента на домашней странице, вы можете обнаружить, что вместо того, чтобы начать сканирование на twitch.tv, вам следует перейти по https://api.twitch.tv/kraken/streams/featured?limit=6&geo=US&lang=en&on_site=1, который предоставляет хорошие данные в формате JSON, например:
{"_links":
{"self":"https://api.twitch.tv/kraken/streams/featured?geo=US&lang=en&limit=6&offset=0",
"next":"https://api.twitch.tv/kraken/streams/featured?geo=US&lang=en&limit=6&offset=6"},
"featured":[
{"text":"<p>SNES Super Stars is a 11-day speedrun marathon devoted to the Super Nintendo Entertainment System. From March 10th-20th, watch over 200 games being beaten amazingly fast and races between some of the top speedrunners in the world!</p>\n\n<br>\n\n\n<p><a href=\"/speedgaming\">Click here</a> to watch and chat!</p>\n\n<p><a href=\"communitysuccess,speedrun\"></a></p>\n",
"title":"SNES Super Stars Marathon",
"sponsored":false,
"priority":5,
"scheduled":true,
...
И вы можете просто перейти по ссылкам оттуда. Вам также придется эмулировать заголовки для этого запроса. Таким образом, приведенный выше пример не будет работать, если вы не укажете в заголовке запроса идентификатор клиента, который вы, вероятно, сможете извлечь из заголовка исходного запроса. Каждый раздел или функция сайта, вероятно, имеет свою собственную конечную точку API, к которой вы, возможно, сможете получить доступ, и это также немного проще на серверах с подстройкой, потому что им не нужно обслуживать все эти изображения и видео, что является беспроигрышным вариантом. Также, если вы заметите некоторые аргументы запроса в конце URL-адреса, вы, вероятно, сможете манипулировать количеством возвращаемых элементов (limit=6).
Это должно получить то, что вы хотите, хотя вам придется копаться для конечных точек. Но, если по какой-либо причине вам действительно нужно динамически обрабатывать javascript и не хотите автоматизировать браузер с селеном, оставаясь в экосистеме scrapy, то есть также проект-скребок scrapinghub, который довольно хорошо интегрируется с scrapy.