Как бот для мониторинга новых товаров помогает опередить конкурентов?
Ручной просмотр каталогов конкурентов отнимает часы ежедневно. Вместо того чтобы сосредоточиться на стратегии, вы вынуждены открывать десятки страниц, выискивая новые позиции. Один конкурент с 20 категориями и 50 страницами каталога отнимает около 30–40 минут в день. При 5–10 конкурентах это превращается в полноценную рабочую смену, а человеческий фактор неизбежно приводит к пропуску 20–30% новинок.
Мы автоматизируем этот процесс. Наш бот ежедневно сканирует страницы товаров по заданным расписаниям и мгновенно уведомляет вас о новинках через Telegram. Вы получаете только реальные изменения, без шума. Это позволяет реагировать быстрее конкурентов и не упускать аудиторию.
За 5+ лет работы мы разработали решения для 40+ интернет-магазинов, от небольших нишевых проектов до крупных маркетплейсов. Наш опыт гарантирует стабильную работу даже при смене вёрстки конкурента — мы используем семантические селекторы и fallback-стратегии. Экономия времени на мониторинг — до 80%. Бот обрабатывает до 10 000 SKU в день, генерируя отчёты в реальном времени.
Почему ручной мониторинг неэффективен?
У конкурентов сотни страниц каталога, и они обновляются ежедневно. Просматривать их вручную — терять время и упускать новинки. Бот проверяет каждую страницу по расписанию, и вы узнаёте о новых товарах за минуты.
Кроме того, человеческий глаз не способен одновременно отслеживать десятки категорий. Пропуски неизбежны, особенно если товар появляется в середине списка. Бот же фиксирует каждое изменение, сравнивая текущее состояние с эталонным снимком.
Как бот обнаруживает новые товары?
Мониторинг новых товаров отличается от мониторинга цен. Мы следим не за конкретным URL, а за разделами каталога — категориями, страницами "Новинки", результатами поиска. Алгоритм выглядит так:
Конфигурация (URL каталога + селектор) → Scraper → Snapshot → Diff → Alert
- Scraper загружает страницу и извлекает список товаров по CSS-селекторам.
- Каждый товар сохраняется в БД с хешем полей.
- При повторном сканировании новый список сравнивается с предыдущим.
- Отсутствующие в старом снимке позиции помечаются как новинки.
- Система отправляет уведомление в Telegram.
Подробный алгоритм работы детектора
Для каждого конкурента настраивается JSON-конфиг с селекторами и правилами пагинации:
{
"pagination": {
"type": "url_param",
"param": "page",
"max_pages": 20
},
"item_selector": ".catalog-item",
"fields": {
"url": {"selector": "a.product-link", "attr": "href"},
"title": {"selector": ".product-name", "text": true},
"sku": {"selector": "[data-sku]", "attr": "data-sku"},
"price": {"selector": ".price", "text": true},
"image": {"selector": "img.product-image", "attr": "src"}
}
}
Схема данных для хранения снимков и новинок:
CREATE TABLE competitor_catalogs (
id BIGSERIAL PRIMARY KEY,
competitor_id INT REFERENCES competitors(id),
url TEXT NOT NULL,
scrape_config JSONB NOT NULL,
check_interval INTERVAL DEFAULT '6 hours',
last_checked_at TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE
);
CREATE TABLE competitor_items (
id BIGSERIAL PRIMARY KEY,
catalog_id BIGINT REFERENCES competitor_catalogs(id),
external_url TEXT NOT NULL,
title TEXT,
external_sku VARCHAR(255),
price NUMERIC(12,2),
image_url TEXT,
first_seen_at TIMESTAMP DEFAULT NOW(),
last_seen_at TIMESTAMP DEFAULT NOW(),
is_new BOOLEAN DEFAULT TRUE,
UNIQUE(catalog_id, external_url)
);
CREATE INDEX idx_competitor_items_new
ON competitor_items(catalog_id, first_seen_at)
WHERE is_new = TRUE;
Сам скрапер реализован на PHP с использованием Symfony DomCrawler:
class CatalogScraper
{
public function scrape(CompetitorCatalog $catalog): array
{
$config = $catalog->scrape_config;
$items = [];
$maxPages = $config['pagination']['max_pages'] ?? 1;
for ($page = 1; $page <= $maxPages; $page++) {
$url = $this->buildPageUrl($catalog->url, $config['pagination'], $page);
$html = $this->fetchWithRetry($url);
if (!$html) break;
$pageItems = $this->extractItems($html, $config);
if (empty($pageItems)) break;
$items = array_merge($items, $pageItems);
usleep(rand(1_500_000, 3_000_000));
}
return $items;
}
private function extractItems(string $html, array $config): array
{
$crawler = new \Symfony\Component\DomCrawler\Crawler($html);
$items = [];
$crawler->filter($config['item_selector'])->each(function ($node) use ($config, &$items) {
$item = [];
foreach ($config['fields'] as $field => $fieldConfig) {
try {
$el = $node->filter($fieldConfig['selector'])->first();
if ($el->count() === 0) continue;
$item[$field] = isset($fieldConfig['attr'])
? $el->attr($fieldConfig['attr'])
: $el->text();
} catch (\Exception $e) {
continue;
}
}
if (!empty($item['url'])) {
$items[] = $item;
}
});
return $items;
}
}
Сервис обнаружения новинок:
class NewProductDetectionService
{
public function process(CompetitorCatalog $catalog): DetectionResult
{
$scraped = $this->scraper->scrape($catalog);
$newItems = [];
foreach ($scraped as $item) {
$url = $this->normalizeUrl($item['url'], $catalog->url);
$existing = CompetitorItem::where([
'catalog_id' => $catalog->id,
'external_url' => $url,
])->first();
if (!$existing) {
$created = CompetitorItem::create([
'catalog_id' => $catalog->id,
'external_url' => $url,
'title' => $item['title'] ?? null,
'external_sku' => $item['sku'] ?? null,
'price' => $this->parsePrice($item['price'] ?? ''),
'image_url' => $item['image'] ?? null,
'is_new' => true,
]);
$newItems[] = $created;
} else {
$existing->update(['last_seen_at' => now()]);
}
}
$disappeared = CompetitorItem::where('catalog_id', $catalog->id)
->where('last_seen_at', '<', now()->subDays(3))
->get();
$catalog->update(['last_checked_at' => now()]);
return new DetectionResult(newItems: $newItems, disappeared: $disappeared);
}
}
После обнаружения новинок бот отправляет сообщение в Telegram с краткой информацией: название, цена, ссылка. Уведомления приходят в течение минуты после сканирования.
Обход защит от ботов
| Защита | Метод обхода |
|---|---|
| Cloudflare Bot Management | Playwright + stealth plugin |
| Rate limiting | Случайные задержки 2–5 сек между запросами |
| IP-блокировки | Ротация прокси (residential proxies) |
| Требование cookies/сессии | Headless-браузер с сохранением сессии |
| JS-рендеринг | Playwright/Puppeteer вместо curl |
Что входит в работу
- Конфигурация до 5 конкурентов (категории, селекторы, интервалы)
- Настройка Telegram-уведомлений (новинки, исчезновения)
- Развёртывание на вашем сервере (Docker-образ)
- Документация по эксплуатации
- Обучение команды (1 час)
- Поддержка и доработки в течение 1 месяца
Сравнение подходов
| Параметр | Ручной мониторинг | Бот |
|---|---|---|
| Время на проверку 1 конкурента | 30 мин/день | 1 сек/день |
| Пропуск новинок | до 30% | <1% |
| Реакция на изменения | часы–дни | минуты |
| Затраты на масштабирование | линейные | фиксированные |
Типичные ошибки при мониторинге и как их избежать
-
Игнорирование пагинации. Если у конкурента больше одной страницы, бот пройдёт по всем. Проверьте настройку
max_pages. - Слишком частые запросы. Риск блокировки. Рекомендуем интервал 6–12 часов.
- Жёсткие селекторы. При изменении вёрстки селектор может сломаться. Используйте data-атрибуты или классы-идентификаторы.
- Отсутствие обработки ошибок. Если страница временно недоступна, бот должен повторять попытку с задержкой.
Сроки реализации
- CatalogScraper + конфигурация через JSON: 1–2 дня
- NewProductDetectionService + схема данных: 1 день
- Уведомления Telegram: 0.5 дня
- Playwright-адаптер для JS-сайтов: +1 день
- Ротация прокси: +0.5 дня
Итого: 3–4 рабочих дня.
Получите консультацию по автоматизации мониторинга — это бесплатно. Наши инженеры проведут аудит ваших конкурентов и предложат оптимальное решение.
Свяжитесь с нами, чтобы обсудить вашу задачу. Мы оценим проект и подберём конфигурацию под ваш бюджет.







