Сбор публичного каталога товаров: Python и API
Как получать публичные карточки товаров: официальный API, HTML, пагинация, дедупликация, контроль изменений и этичные ограничения.
Команда InfraProxy
12 февраля 2026 г.•обновлено 18 августа 2026 г.
Сбор каталога начинается не с прокси, а со схемы данных и разрешённого источника. Предпочитайте официальный 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.
Иерархия источников
Используйте источники в таком порядке:
- Официальный API.
- Публичный товарный фид.
- Структурированные данные JSON-LD на публичной странице.
- 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Читайте также
Динамические товарные фиды: сбор и нормализация
Архитектура получения публичных товарных фидов: API, JavaScript-рендеринг, варианты товаров, дедупликация и контроль изменений.
БизнесЦеновая разведка в e-commerce: полное руководство
Как выстроить систему мониторинга цен конкурентов с помощью прокси и веб-скрейпинга: от стратегии до автоматизации. Практическое руководство для интернет-магазинов.
ТехническоеETL-пайплайны с веб-скрейпингом: от извлечения до загрузки
Как строить production-ready ETL-пайплайны с использованием веб-скрейпинга: извлечение, трансформация, загрузка данных, планирование и мониторинг.