К содержимому

Документация

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: автоматический режим, отключение, параметры сайта, агент и проверка результата. Пользовательское руководство и цены.