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

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

Сайт с JavaScript: клики и прокрутка

Начните с обычного HTTP-запроса. Если он не содержит товаров, откройте страницу через браузер. Такой способ расходует больше ресурсов, поэтому держите страницу только на время нужных действий.

Клик и проверка новых данных

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

async function run(ctx) {
  const url = ctx.param('catalog_url', '');
  if (!url) ctx.abort('Укажите адрес каталога');
  const page = await ctx.browser().open(url);
  const seen = new Set();
  try {
    for (let step = 0; step < 5; step++) {
      if (await ctx.cancelled()) ctx.abort('Сбор остановлен');
      await page.waitFor('.product-card');
      const dom = ctx.dom(await page.content(), url);
      let newRecords = 0;
      for (const card of dom.qa('.product-card')) {
        const sku = card.attr('data-sku');
        if (!sku || seen.has(sku)) continue;
        seen.add(sku);
        newRecords++;
        ctx.emit({ sku, name: card.q('.title')?.text() ?? '' }, sku);
      }
      ctx.progress(step + 1, 5, 'Каталог');
      if (step === 4 || newRecords === 0 || !dom.q('button.load-more')) break;
      await page.click('button.load-more');
    }
  } finally {
    await page.close();
  }
}

Для обычной прокрутки используйте await page.scroll(steps, delayMs) или await page.scrollTo(selector). Для поля поиска подходят type(), press() и select(). После действия проверяйте содержимое страницы, а не только факт успешного клика.

Ответы сети

Если интерфейс запрашивает JSON после клика, можно включить захват нужных URL через captureResponses(patterns), затем получить responses() или дождаться waitForResponse(pattern, timeoutMs). Захват не видит запросы, которые произошли до его включения. Для самого первого открытия укажите маски вторым аргументом ctx.browser().open(url, patterns).

Не записывайте в результат токены, cookie и заголовки авторизации из захваченных ответов. Берите только необходимые поля товара. Количество масок и объём ответов ограничены сервисом браузера.

BrowserPage: все действия · Жизненный цикл