Как корректно парсить динамически обновляемую статистику с сайта?
Работаю над небольшим личным проектом для анализа спортивных прогнозов. В качестве тренировочных данных хочу использовать открытые показатели (ROI, точность, прибыль) с разных платформ (вроде Sports. ru, СТАВКА ТВ, championat. com). Столкнулся с проблемой: часть данных подгружается динамически через JS, и обычный requests их не возвращает.
Как правильно организовать парсинг таких страниц? Нужно ли использовать Selenium или есть более лёгкие способы?
Ответы (1 шт):
Внимание! Парсинг некоторых сайтов может нарушать условия пользования этого самого сайта, что может повлечь к санкциям со стороны его создателей (хоть практически всем на это плевать) всё описано лишь в демонстративных целях!
Очень часто для парсинга сайтов зачем то используют эмулятор браузера, когда в 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, или на сервер постоянно отправляется ваше положение курсора, которое надо эмулировать или какая ни будь другая бредовая анти-бот система. В иных случаях гораздо легче работать с запросами напрямую, без лишней эмуляции.




