Как сканировать 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.

Другие вопросы по тегам