Верстакфорум практиков
рекламаiprazon: приватные серверные адреса IPv4 и SOCKS5, безлимитный трафик, бесплатный тест до 2 часов
ФорумСбор данных

Страница рисуется скриптом, в ответе пусто

proxy_hands
proxy_hands
Знаток
сообщений 1405
с мая
22 августа, 17:07первое сообщение

Открываю карточку в браузере, вижу цену, остаток, характеристики. Тяну ту же страницу запросом, в теле почти ничего: шапка, подвал, пустой контейнер под товар и пачка скриптов.

Понятно, что содержимое дорисовывается скриптом. Вопрос в том, обязательно ли тащить сюда браузер. Он тяжёлый, на прогон в сто тысяч карточек мне такое не поднять.

scrapy_boy
scrapy_boy
Участник
сообщений 530
с окт
1 января, 08:24#2

Браузер тут крайняя мера. Сначала смотрите, откуда страница берёт данные: почти всегда это отдельный запрос, и его можно повторить напрямую.

Откройте вкладку сети, обновите карточку, отсортируйте по типу и найдите ответ с товаром внутри. Дальше правый клик, скопировать как cURL, и у вас готовая рабочая команда со всеми заголовками.

proxy_hands
proxy_hands
Знаток
сообщений 1405
с мая
8 июня, 11:41#3
scrapy_boy: скопировать как cURL

Скопировал, работает. Но там в параметрах длинная строка, похожая на подпись, и она у каждой карточки своя. Откуда её брать при обходе, я же не открываю страницу браузером.

gremlin_dv
gremlin_dv
Знаток
сообщений 1840
с мар
15 ноября, 14:58#4

Значит она лежит в самой странице, других вариантов немного. Обычно её кладут в один из трёх мест: в атрибут контейнера, в переменную внутри инлайнового скрипта, в мета-тег.

Порядок такой: тянете страницу обычным запросом, вытаскиваете подпись регуляркой, следом идёте за данными. Два запроса вместо одного, зато без браузера.

import re, requests

s = requests.Session() html = s.get(f"https://shop.example/tovar/{art}").text podpis = re.search(r'"signature"\s*:\s*"([a-f0-9]{32})"', html).group(1) tovar = s.get("https://shop.example/api/tovar", params={"art": art, "signature": podpis}, headers={"Referer": f"https://shop.example/tovar/{art}"}).json() print(tovar["price"], tovar["stock"]) ```

три монитора и ни одного свободного
Женя Ковалёв
Женя Ковалёв
Новичок
сообщений 62
с авг, второй сезон
22 апреля, 17:15#5

а если подписи в html нет и её считает скрипт на лету?

Кирилл Бакин
Кирилл Бакин
Знаток
сообщений 1560
с апр
1 сентября, 08:32#6

Бывает и так. Тогда открываете тот скрипт и смотрите, из чего она считается. В девяти случаях из десяти внутри что-то простое: время, артикул и постоянная строка, всё это прогоняется через известный хеш. Такое переносится в свой код за полчаса.

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

И проверьте заодно вот что: часто у сайта есть облегчённая версия для поисковых систем, где всё нарисовано на сервере. Иногда это отдельный поддомен, иногда та же страница по другому пути. Тогда весь вопрос со скриптами отпадает целиком.

путь к данным, от дешёвого к дорогому
путь к данным, от дешёвого к дорогому
Света Панина
Света Панина
Новичок
сообщений 160
с мар, второй сезон
8 февраля, 11:49#7

подскажите новичку, а как в сети найти нужный запрос, если их там полсотни?

scrapy_boy
scrapy_boy
Участник
сообщений 530
с окт
15 июля, 14:06#8

Фильтр по типу Fetch и XHR, дальше поиск по вкладке сети: вбиваете кусок цены или артикул прямо в строку поиска, браузер покажет, в каком ответе это встречается. Секунд десять.

proxy_hands
proxy_hands
Знаток
сообщений 1405
с мая
22 декабря, 17:23#9

Разобрался. Подпись оказалась в инлайновом скрипте, считается от артикула и метки времени, обычный хеш, перенёс к себе за вечер.

Сто тысяч карточек собрались за два с небольшим часа обычными запросами, браузер не понадобился совсем. Поиск по значению во вкладке сети отдельное спасибо, я про него не знал.