Как корректно парсить динамически обновляемую статистику с сайта?

Работаю над небольшим личным проектом для анализа спортивных прогнозов. В качестве тренировочных данных хочу использовать открытые показатели (ROI, точность, прибыль) с разных платформ (вроде Sports. ru, СТАВКА ТВ, championat. com). Столкнулся с проблемой: часть данных подгружается динамически через JS, и обычный requests их не возвращает.

Как правильно организовать парсинг таких страниц? Нужно ли использовать Selenium или есть более лёгкие способы?


Ответы (1 шт):

Автор решения: CREAsTIVE

Внимание! Парсинг некоторых сайтов может нарушать условия пользования этого самого сайта, что может повлечь к санкциям со стороны его создателей (хоть практически всем на это плевать) всё описано лишь в демонстративных целях!

Очень часто для парсинга сайтов зачем то используют эмулятор браузера, когда в 95% случаев все данные можно легко вытащить через пару запросов. И не надо разбирать никакие js скрипты, достаточно посмотреть какие данные приходят, какие данные уходят и реплицировать запросы, которые отправляет ваш браузер.

Сайт может рендерить данные либо на стороне сервера (в таком случае все данные отправляются сразу в html), либо на стороне клиента (клиент принимает html и js скрипт, который уже запрашивает данные у сервера или данные вставляются в сам js скрипт, обычно в виде json)

Cервер-сайд рендеринг на примере stavka.tv

Первым делом необходимо найти на сайте сам список элементов, которые мы хотим спарсить, немного полазив по stavka.tv я нашёл следующую таблицу.

Теперь открываем devtools браузера, который используем, обычно на F12 (он присутствует и сильно похож в большинстве популярных браузеров, точно есть в chrome, firefox и edge, в данном ответе я буду использовать edge), в ней нас в основном интересует вкладка сеть.

Во вкладке сеть включаем запись и перезагружаем страницу. Первым делом нас интересует пришедший html: введите сюда описание изображения

Берём какие либо данные из сайта и ищем их в этом html через ctrl+f, находим:

введите сюда описание изображения

Мы видим в нём данные, которые нас интересуют, а именно количество голов, что совпадает с отображаемым на сайте:

введите сюда описание изображения

Теперь нам необходимо составить запрос. Переходим в под-вкладку Headers, в нём копируем сырой запрос: введите сюда описание изображения

Или можно использовать функцию copy: введите сюда описание изображения

И получаем полностью рабочий запрос. Далее дело остаётся лишь за парсингом html файла:

введите сюда описание изображения

Клиент-сайд рендеринг на примере sports.ru

Делаем всё тоже самое, тут ситуация интереснее: большая часть данных рендерится, а остальная - на клиенте, через запросы (ужас). Допустим, что нас интересует не верхняя таблица, которая рендерится на сервере, а нижняя, вот эта (при этом если мы перейдём на "полная таблица", то нас отправит на страницу, где та же таблица в таком же стиле рендерится на стороне сервера... ужасы какие то):

введите сюда описание изображения

Мы не видим многие данные этой таблицы в html, и при обновлении страницы она появляется не сразу - значит данные о ней получаются и рендерятся через json.

В таком случае необходимо найти запрос, отвечающий за получение этих данных

введите сюда описание изображения

Ну и находим красивый json со всеми нужными данными. Далее копируем запрос точно так же, как описано выше.


Использование Selenium не только увеличивает накладные ресурсы, оно так же уменьшает надёжность всей системы. В большинстве случаев сайты имеют собственное внутреннее неофициальное API, которое меняют в разы реже, чем фронт. При этом полное изучение сайта обычно занимает максимум час-полтора, лично мне достаточно до 10 минут, чтобы получить нужные мне запросы.

К Selenium стоит прибегать, только если для обычная отправка запросов с рандомизацией куки / параметров не работает, например: если отправка запросов используются какие-то не тривиальные куки, которые практически невозможно подделать без разбора обфусцированного js, или на сервер постоянно отправляется ваше положение курсора, которое надо эмулировать или какая ни будь другая бредовая анти-бот система. В иных случаях гораздо легче работать с запросами напрямую, без лишней эмуляции.

→ Ссылка