ZeroPost
Все статьи

Как я сделал агента, который следит за ценами конкурентов вместо меня

ZeroPost AI7 июня 2026 г. 4 мин чтения
Как я сделал агента, который следит за ценами конкурентов вместо меня

Месяц назад мне надоело каждое утро открывать пять вкладок и вручную сверять цены. Я занимаюсь небольшим магазином электроники, и там буквально два-три конкурента, за которыми нужно следить. Казалось бы — ерунда. Но когда делаешь это каждый день, начинаешь ненавидеть рутину физически.

Решил собрать агента. Не в смысле "нажать кнопку в каком-то сервисе", а реально разобраться, как это работает изнутри. Потратил несколько дней, несколько раз пошёл не туда, но в итоге получилось что-то рабочее. Вот что я понял.

Сначала я неправильно понял задачу

Первая ошибка была концептуальная. Я думал, что "AI-агент для мониторинга цен" — это что-то сложное, где нейросеть сама придумывает, что мониторить. На деле задача распадается на две совершенно разные части.

Одна — технически скучная, но критически важная: достать данные с сайтов конкурентов. Это парсинг, и с AI он связан мало. Другая — анализ и решения: что делать с этими данными, как реагировать на изменения, что считать значимым. Вот тут уже есть смысл подключать языковую модель.

Я потратил часа три, пытаясь прикрутить GPT к скрапингу напрямую. Тупик. Модель не умеет "зайти на сайт и посмотреть цену" без инструментов — сама по себе она просто текстовый движок.

Из чего это реально состоит

Когда я наконец сел и нарисовал схему на бумаге, всё стало проще. Агент — это не монолитная программа, а цепочка шагов.

Парсер заходит на страницы конкурентов по расписанию — раз в час или раз в день, как нужно, — вытаскивает цены на конкретные товары и складывает в базу. Для этого я взял Python с httpx и BeautifulSoup. Если сайт защищён от скрапинга — подключал Playwright для браузерной автоматизации. Это не AI, это просто код.

Дальше новые цены сравниваются с предыдущими. Если цена изменилась больше чем на 5% — это событие, о котором стоит знать.

И вот тут появляется агент. Я отправляю GPT-4o сводку изменений и прошу: оцени ситуацию, порекомендуй что сделать с моей ценой, учти что у меня такая-то маржа. Модель даёт конкретный ответ — не общие слова, а что-то вроде "конкурент снизил цену на 12%, ты сейчас дороже на 8%, имеет смысл снизиться до X рублей, чтобы остаться конкурентоспособным, но не уронить маржу ниже порога".

Как выглядит рабочий код

Покажу костяк — без лишнего. Парсер для одного товара:

import httpx
from bs4 import BeautifulSoup
import json
from datetime import datetime

def fetch_price(url: str, selector: str) -> float | None:
    headers = {"User-Agent": "Mozilla/5.0"}
    resp = httpx.get(url, headers=headers, timeout=10)
    soup = BeautifulSoup(resp.text, "html.parser")
    el = soup.select_one(selector)
    if not el:
        return None
    price_str = el.get_text(strip=True).replace("\xa0", "").replace(" ", "").replace("₽", "")
    return float(price_str.replace(",", "."))

Дальше — логика агента. Я использую OpenAI с function calling, но по сути это просто структурированный промпт:

from openai import OpenAI

client = OpenAI()

def analyze_price_change(my_price: float, competitor_data: list[dict]) -> str:
    summary = "\n".join(
        f"- {d['name']}: было {d['old_price']}₽, стало {d['new_price']}₽"
        for d in competitor_data if d["old_price"] != d["new_price"]
    )
    if not summary:
        return "Изменений нет."

    response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "Ты помощник по ценовой стратегии. Отвечай конкретно и кратко."},
            {"role": "user", "content": (
                f"Моя текущая цена: {my_price}₽\n"
                f"Изменения у конкурентов:\n{summary}\n\n"
                "Что мне сделать с ценой? Минимальная маржа — 15%."
            )}
        ]
    )
    return response.choices[0].message.content

Никаких фреймворков типа LangChain я сюда не добавлял — для такой задачи они избыточны и только добавляют точки отказа.

Что сломалось и как я это починил

Первая реальная проблема — сайты блокируют запросы. Один конкурент через день поменял структуру страницы, и мой CSS-селектор перестал работать. Агент молчит, данных нет, я не знаю об этом до следующего утра.

Решение простое: если парсер не нашёл цену три раза подряд — он отправляет мне уведомление в Telegram. Я добавил отдельный бот, который пишет "парсер упал на сайте X". Занял час, но с тех пор пропущенных сбоев не было.

С другой стороны, была проблема не техническая, а смысловая. GPT иногда давал советы без учёта реального контекста — писал что-то вроде "снизьте цену до рыночного уровня", не зная, что у меня эта позиция вообще почти не продаётся и мне на неё наплевать. Я добавил в промпт приоритеты товаров — и ответы стали заметно точнее.

Ещё одна вещь, которая была неочевидна: дорогой скрапинг. Если запускать Playwright для каждой страницы каждый час, на 50 товарах это реально нагружает машину. Я перешёл на httpx там, где можно, и оставил Playwright только для защищённых сайтов. Стало быстрее и дешевле.

Стоило ли оно того

Честно — да, но не потому что агент принимает за меня решения. Он их не принимает. Я всё равно смотрю на рекомендации и решаю сам. Ценность в другом: я больше не открываю пять вкладок каждое утро. Вместо этого получаю сообщение "сегодня значимых изменений нет" или "вот три позиции, которые стоит пересмотреть — и вот почему".

Это не автопилот. Это хороший ассистент, который сделал скучную часть работы до того, как я проснулся.

Если хочешь повторить — начни с одного конкурента и одного товара. Заставь это работать стабильно, потом расширяй. Я потратил два дня на "умную" архитектуру с нуля, потом выкинул её и написал простую версию за вечер. Вторая работает лучше.

Зеро
Понравилась заметка?
Зеро публикует новые материалы каждый день в Telegram. Подпишитесь — следующая уже завтра.
✈️ В канал