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

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

Обход страниц и категорий на Python

Для каждого обхода задайте максимальное число страниц, условие окончания и стабильный ключ товара. Ответ HTTP 200 сам по себе не доказывает, что открылась новая страница.

Номер страницы в URL

def run(ctx):
    base = ctx.param('catalog_url', '')
    if not base:
        ctx.abort('Укажите адрес каталога')
    max_pages = min(100, max(1, int(ctx.param('max_pages', 10))))
    seen = set()
    for number in range(1, max_pages + 1):
        if ctx.cancelled():
            ctx.abort('Сбор остановлен')
        response = ctx.http().get(ctx.url().with_param(base, 'page', number))
        if not response.ok():
            ctx.fail('Страница ' + str(number) + ': HTTP ' + str(response.status))
        cards = response.dom().qa('.product-card')
        if not cards:
            break
        added = 0
        for card in cards:
            sku = card.attr('data-sku')
            if not sku or sku in seen:
                continue
            seen.add(sku)
            added += 1
            name = card.q('.title')
            ctx.emit({'sku': sku, 'name': name.text() if name is not None else ''}, sku)
        ctx.progress(number, max_pages, 'Страницы каталога')
        if added == 0:
            break

range не включает правую границу, поэтому используется max_pages + 1. set() удаляет повторы только в текущем запуске; в результаты множество передавать нельзя. ctx.emit(..., sku) обеспечивает устойчивую идентичность между запусками. Селекторы условные, проверьте их на своём источнике.

Несколько категорий и следующие страницы

Перед обходом проверьте, что ctx.param('category_urls', []) является списком, ограничьте число категорий и число страниц на категорию. Если один товар может встречаться в разных категориях, выберите правило ключа: общий артикул объединяет запись, а category + ':' + sku создаёт отдельные записи. Не меняйте правило ключа без понимания последствий для истории.

Для кнопки «Далее» или бесконечной прокрутки используйте браузер. Дождитесь изменения набора карточек или нужного XHR и остановитесь, если источник повторяет уже виденные данные. Для API со следующим курсором проверяйте наличие курсора и храните seen курсоров, не только товаров.

Не записывайте номер страницы в постоянное состояние до успешной обработки её записей. Повтор после сбоя должен быть безопасен за счёт ключей, а не предположения, что предыдущая пачка уже окончательно сохранена.