PHP SDK: Страницы с JavaScript и действия браузера
Если HTML ответа не содержит товаров, а в обычном браузере они есть, сайт может дорисовывать каталог через JavaScript. В настройках сайта выберите браузерный режим. Обычный $ctx->http()->get() тогда получит отрисованную страницу через платформу.
Для кликов, поиска и прокрутки используйте управляемую страницу.
<?php
function run(\Sdk\Context $ctx): void
{
$url = (string) $ctx->param('catalog_url', '');
if ($url === '') {
$ctx->abort('Укажите catalog_url');
}
$page = $ctx->browser()->open($url);
try {
$page->waitFor('.product-card', 15000);
$ctx->log('Каталог отрисован');
$dom = $ctx->dom($page->content(), $url);
foreach ($dom->qa('.product-card') as $card) {
$sku = $card->attr('data-sku');
if ($sku !== null) {
$ctx->emit(['sku' => $sku, 'name' => $card->q('.product-title')?->text()], $sku);
}
}
$ctx->log('Снимок страницы сохранён', ['snapshot' => $page->screenshot()]);
} finally {
$page->close();
}
}
waitFor() ждёт нужный элемент, а не просто окончания сетевой загрузки. Это важно для пустых снимков и частично отрисованных страниц. Селекторы в примере условные.
Доступные действия
| Вызов | Назначение |
|---|---|
$page->goto($url) |
Перейти по другому адресу в той же странице |
$page->click('.load-more') |
Нажать кнопку по CSS-селектору |
$page->type('input[name=q]', 'ремень') |
Ввести текст |
$page->scroll(3, 500) |
Три шага прокрутки с паузами по 500 мс |
$page->waitFor('.product-card', 15000) |
Дождаться элемента, максимум 15 секунд |
$page->content() |
Получить текущий HTML |
$page->screenshot() |
Сохранить снимок и получить его UUID |
$page->close() |
Закрыть страницу и освободить место |
Одновременно можно открыть не более двух страниц. Всегда закрывайте их через finally. Для «Показать ещё» после клика проверяйте рост числа карточек и наличие следующей порции. Если количество не меняется, остановитесь с понятным сообщением вместо бесконечных кликов.
Браузерные действия расходуют время обработки. Не ждите фиксированные десятки секунд после каждого действия, если можно дождаться конкретного элемента. Учитывайте лимиты сайта и прогона.
Получение JSON из сетевого запроса
Если интерфейс показывает лишь часть ответа API, используйте захват XHR/fetch браузером. Маски нужно включить до навигации или действия, вызывающего запрос.
CAPTCHA
Настройка CAPTCHA и API: автоматический режим, отключение, параметры сайта, агент и проверка результата. Пользовательское руководство и цены.