Первый сценарий сбора на TypeScript
Этот пример собирает карточки каталога и сохраняет артикул, название, цену и ссылку. Его можно использовать как основу: замените URL и CSS-селекторы на те, которые соответствуют вашему сайту.
Подготовка
Создайте сайт, затем сценарий на TypeScript. В настройках сайта задайте поля sku, name, price и url. Если адрес каталога меняется, добавьте параметр catalog_url. Метод ctx.param() получит его во время запуска.
Код
async function run(ctx: Akmelo.Context): Promise<void> {
const url = ctx.param('catalog_url', '');
if (!url) ctx.abort('Укажите адрес каталога');
ctx.log('Загружаем каталог');
const response = await ctx.http().get(url);
if (!response.ok()) ctx.fail(`Каталог ответил HTTP ${response.status}`);
const cards = response.dom().qa('.product-card');
if (!cards.length) ctx.fail('Карточки товаров не найдены');
let saved = 0;
for (const card of cards) {
if (await ctx.cancelled()) ctx.abort('Сбор остановлен');
const sku = card.attr('data-sku');
const link = card.q('a')?.abs('href');
if (!sku || !link) continue;
ctx.emit({
sku,
name: card.q('.title')?.text() ?? '',
price: ctx.text().money(card.q('.price')?.text() ?? null),
url: link,
}, sku);
saved++;
}
ctx.metric('products_saved', saved);
ctx.progress(1, 1, 'Каталог обработан');
ctx.log('Готово', { saved });
}
ctx.http().get() асинхронен, поэтому перед ним стоит await. Разбор HTML и очистка цены происходят локально. ctx.emit() записывает обычный объект, а sku служит стабильным ключом. Если у сайта разные товары с одним артикулом, выберите ключ, который действительно уникален для вашей задачи.
Проверка и развитие
Сначала выполните пробный прогон. Сравните несколько записей с сайтом: название, цену, ссылку и пропущенные карточки. Если каталог разбит на страницы, добавьте обход страниц. Если товары появляются только после клика, используйте браузерные действия. После проверки опубликуйте версию и отдельно запустите рабочий сбор.