Обход страниц и категорий на 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 курсоров, не только товаров.
Не записывайте номер страницы в постоянное состояние до успешной обработки её записей. Повтор после сбоя должен быть безопасен за счёт ключей, а не предположения, что предыдущая пачка уже окончательно сохранена.