Первый сценарий сбора на PHP
Сценарий отвечает на три вопроса: какую страницу открыть, где в ней лежат нужные значения и какую запись сохранить. Напишите его в разделе Сценарии или начните с заготовки AI помощника.
Сценарии сбора выполняются на PHP, JavaScript, TypeScript и Python. Ниже показан PHP-пример; первый сценарий на JavaScript находится рядом в разделе SDK. Для кода с типами откройте TypeScript, для синхронного def run(ctx): откройте Python. Go и другие языки планируются. Примеры в разделе API относятся к внешним интеграциям.
Подготовьте источник
- Создайте сайт и укажите его адрес.
- В полях сайта добавьте
sku(строка, ключ),name(строка),price(дробное число),url(ссылка). - Создайте сценарий этого сайта. Точка входа по умолчанию называется
run. - Вставьте код ниже и замените CSS-селекторы разметкой своего каталога. В параметрах запуска передайте
catalog_urlс адресом каталога.
Пример: одна страница каталога
<?php
function run(\Sdk\Context $ctx): void
{
$url = (string) $ctx->param('catalog_url', '');
if ($url === '') {
$ctx->abort('Укажите catalog_url в параметрах запуска');
}
$ctx->log('Открываем каталог', ['url' => $url]);
$response = $ctx->http()->get($url);
if (!$response->ok()) {
$ctx->abort('Каталог ответил HTTP ' . $response->status);
}
$cards = $response->dom()->qa('.product-card');
if (count($cards) === 0) {
$ctx->abort('Карточки не найдены. Проверьте селектор и режим загрузки');
}
$done = 0;
foreach ($cards as $card) {
$sku = $card->attr('data-sku');
if ($sku === null || $sku === '') {
$ctx->log('Пропущена карточка без артикула', [], 'warning');
continue;
}
$ctx->emit([
'sku' => $sku,
'name' => $card->q('.product-title')?->text(),
'price' => $ctx->text()->money($card->q('.price')?->text()),
'url' => $card->q('a.product-link')?->abs(),
], $sku);
$done++;
$ctx->progress($done, count($cards), 'Читаем товары');
}
$ctx->log('Страница обработана', ['saved' => $done]);
}
$ctx предоставляет доступ к HTTP, HTML, журналу и результатам. qa() находит все карточки, q() находит один вложенный элемент, text() читает текст, attr() читает атрибут. abs() превращает относительную ссылку в абсолютную.
emit() передаёт запись платформе. Ключ $sku помогает узнавать тот же товар при следующем сборе. Не используйте порядковый номер карточки как ключ: порядок товаров меняется. money() разбирает цену вроде «1 500,50 ₽», сохраняя дробную часть. Отсутствующая цена остаётся null, а не превращается в ноль.
Как подобрать селекторы
Откройте визуальный маппер, выберите карточку и поля. .product-card и другие селекторы из примера условные; они не подходят автоматически любому сайту. Посмотрите снимок страницы в журнале прогона и убедитесь, что нужные элементы действительно загружены.
Как проверить
Нажмите проверку кода, сохраните версию, выполните пробный прогон. Откройте журнал и результаты. Сравните несколько записей с сайтом, включая товар без цены. После успешной проверки опубликуйте версию.
Этот пример читает одну страницу. Для всего каталога добавьте пагинацию. Если карточки появляются после JavaScript, используйте браузер.