Все статьиРуководстваСбор данных и Scraper API8 мин

Сбор публичного каталога товаров: Python и API

Как получать публичные карточки товаров: официальный API, HTML, пагинация, дедупликация, контроль изменений и этичные ограничения.

Команда InfraProxy

12 февраля 2026 г.обновлено 18 августа 2026 г.

#каталог товаров#Python#публичные данные#дедупликация#API

Сбор каталога начинается не с прокси, а со схемы данных и разрешённого источника. Предпочитайте официальный API или фид; HTML-парсер используйте только для публичных страниц, где автоматический доступ разрешён.

Какие поля нужны аналитике

Не сохраняйте страницу целиком «на будущее». Зафиксируйте минимальный контракт записи:

{
  "source_id": "product-123",
  "title": "Название товара",
  "price": 1290.0,
  "currency": "RUB",
  "availability": "in_stock",
  "source_url": "https://example.com/catalog/product-123",
  "observed_at": "2026-08-18T07:00:00Z"
}

source_id нужен для дедупликации, observed_at — для временного ряда. Отсутствующую цену храните как null, а не 0.

Иерархия источников

Используйте источники в таком порядке:

  1. Официальный API.
  2. Публичный товарный фид.
  3. Структурированные данные JSON-LD на публичной странице.
  4. HTML-селекторы как последний вариант.

API и фид обычно стабильнее DOM. Если разметка изменилась, CSS-селектор может вернуть пустую строку без явной ошибки.

Учебный пример на разрешённой песочнице

books.toscrape.com создан для практики. Пример получает одну публичную страницу и извлекает названия карточек.

import requests
from bs4 import BeautifulSoup

url = "https://books.toscrape.com/"
response = requests.get(
    url,
    timeout=20,
    headers={"User-Agent": "CatalogResearchBot/1.0 contact@example.com"},
)
response.raise_for_status()

soup = BeautifulSoup(response.text, "html.parser")
rows = []

for card in soup.select("article.product_pod"):
    link = card.select_one("h3 a")
    price = card.select_one(".price_color")
    rows.append({
        "title": link.get("title"),
        "url": link.get("href"),
        "price_raw": price.get_text(strip=True),
    })

print(rows[:3])

В production добавьте проверку количества карточек. Если обычно приходит 40 записей, а стало 0, отправьте документ в карантин и не записывайте пустой снимок как реальное исчезновение ассортимента.

Пагинация без повторов

Очередь должна хранить нормализованный URL и контрольную сумму ответа. Перед добавлением следующей страницы:

  • убедитесь, что URL ещё не обработан;
  • задайте максимум страниц на запуск;
  • остановитесь при повторе содержимого;
  • кэшируйте уже полученные страницы;
  • сохраняйте причину завершения обхода.

Это защищает от циклической пагинации и лишней нагрузки.

Как отслеживать изменения

Сравнивайте снимки по стабильному source_id. Для каждой записи храните:

  • first_seen_at;
  • last_seen_at;
  • последнюю цену;
  • хеш значимых полей;
  • причину недоступности.

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

Что измерять

Метрика Назначение
Успешные страницы Видно реальную полноту обхода
Пустые карточки Ловит изменение селекторов
Дубликаты Проверяет идентификаторы и пагинацию
429/503 Показывает превышение безопасной частоты
Цена без валюты Ловит ошибку нормализации
Изменения на 1000 записей Помогает контролировать аномалии

Этичность и ограничения

Проверьте robots.txt, Disallow, Crawl-delay и условия использования. Если есть официальный API, используйте его. Ограничивайте параллельность, делайте backoff на 429/503, кэшируйте ответы и используйте честный User-Agent. Не обходите логин и paywall, не собирайте персональные данные и не копируйте описания товаров целиком.

Для регулярного коммерческого процесса лучше согласовать фид или API с владельцем данных.

Если нужна выдача публичных страниц без поддержки собственной браузерной инфраструктуры, проверьте Scraper API на разрешённом каталоге.

Ключевые выводы

  • Стабильный API или фид важнее сложного HTML-парсера.
  • source_id и временные метки нужны до первого запуска.
  • Пустой ответ нельзя автоматически считать исчезновением товара.
  • Производственный сбор требует кэша, лимитов и контроля качества.

Краткий ответ: определите схему данных, выберите разрешённый API или фид и только затем добавляйте HTML-парсер с дедупликацией и мониторингом.

Нужно получать публичные данные без поддержки собственной инфраструктуры?

Посмотрите возможности Scraper API, условия теста и примеры интеграции.

Перейти к Scraper API