Создание агента мониторинга цен с помощью Crawl API
TL;DR
Агент по отслеживанию цен — это небольшая цепочка: чтение одобренных URL продуктов, извлечение конкретного поля цены, хранение наблюдений, сравнение с историей и оповещение о значительных изменениях.
Nstdata Crawl обрабатывает загрузку страниц и может возвращать Markdown или HTML. Ваше приложение должно реализовать сопоставление продуктов, извлечение цен, планирование, сохранение и уведомления.
Отклоняйте отсутствующие цены, изменения валюты и несовпадающие варианты перед сравнением значений. Храните исходный URL и временную метку с каждым наблюдением.
Пример, который можно запустить, использует текстовый маркер, специфичный для сайта, и SQLite, чтобы его ограничения были видны; адаптируйте парсер к фактической разметке целевого сайта.
Предположим, что розничная команда хочет знать, когда цена на публичной странице продукта изменится. Cron-задание, которое загружает HTML, может работать на статической странице, но производственный монитор также требует рендеринга, проверки извлечения, истории, дедупликации и политики оповещения. Nstdata Crawl может предоставить содержимое страницы; решения о мониторинге принадлежат приложению. Этот учебник использует иллюстративные данные о продуктах и не делает обязательств относительно живых цен конкурентов.
Что такое агент по отслеживанию цен?
Агент по отслеживанию цен превращает наблюдения в небольшое решение: "Изменился ли тот же продукт, в той же валюте и варианте, достаточно, чтобы уведомить рецензента?" Он отличается от базового скрипта для сбора данных тем, что сохраняет состояние, применяет правила валидации и объясняет свои уведомления. Он не может вывести коммерческое намерение конкурента из изменения цены. Более низкое отображаемое значение может быть акцией, альтернативным вариантом, предложением, специфичным для региона, или ошибкой анализа.
Для каждого продукта определите стабильный product_id, ожидаемое имя или SKU, исходный URL, валюту и интервал проверки. Не объединяйте вариации продуктов без предупреждения. Если целевой сайт предоставляет лицензированную ленту или официальный API, который поставляет необходимые данные, оцените этот путь в первую очередь.
Цепочка — это URL продуктов → Crawl API → извлечение цены → валидация → история SQLite → обнаружение изменений → оповещение. Паук читает страницу. Парсер определяет предполагаемую цену. База данных сохраняет наблюдения. Этап сравнения применяет бизнес-лимиты. Планировщик запускает рабочий процесс, а служба уведомлений отправляет оповещения. Каждый этап должен иметь свой собственный статус ошибки.
Crawl API и сбор веб-данных
Для известного публичного URL продукта запросите Markdown основного содержимого. Если целевая цена встроена в структурированный элемент или визуальный компонент, запросите HTML или снимок экрана для диагностики. Документация по Crawl Nstdata описывает Markdown, HTML, снимки экрана, рендеринг и ожидание страниц. Запрос страницы не означает, что правильное поле цены было извлечено; создайте отдельный парсер и проверьте его вывод.
Запишите наблюдаемую сумму как десятичное число, а не число с плавающей запятой. Храните валюту, идентичность продукта, URL и время наблюдения по UTC. Страница продукта может одновременно отображать цену в списке, цену продажи, подписочную цену, цену за единицу и цены вариантов. Выберите поле, которое собираетесь отслеживать, и задокументируйте этот выбор. Храните также неудачные попытки извлечения, чтобы отсутствующая цена не маскировалась под "без изменений".
Решения агента и уведомления
Вычислите абсолютное и процентное изменение по сравнению с последним действительным наблюдением того же продукта и валюты. Добавьте минимальный порог и подавите дублирующие уведомления для одного и того же наблюдения. Человеческий обзор полезен для крупных изменений или когда парсер недавно изменился. Языковая модель может написать читаемое резюме уведомления, но не должна определять численное изменение по неподтвержденному тексту.
Пошаговая инструкция: создайте агент по отслеживанию цен с помощью Python
Шаг 1: Настройте проект и список URL продуктов
Используйте Python 3.10+ и pip install nstdata-ai-crawl. Установите NSTDATA_API_TOKEN в качестве переменной окружения. Замените https://shop.example.com/products/widget на страницу продукта, которую вам разрешено отслеживать. Маркер образца Цена: USD 129.00 является тестовой установкой, а не универсальным правилом для магазинов. Время выполнения требует доступной учетной записи Nstdata; живой вызов здесь не выполнялся.
Шаг 2: Загружайте страницы продуктов с помощью Nstdata Crawl
Код запрашивает Markdown с onlyMainContent=True и проверяет на пустой результат. Рендеринг JavaScript может помочь страницам, детали продукта на которых заполняются на стороне клиента, но вам все равно нужно проверить, что выбранный элемент цены появлялся в возвращенном содержимом.
Пример: Соберите страницу продукта
fetch_markdown() ниже находится граница SDK. Он возвращает текст парсеру; он не утверждает, что API уже определил цену продукта.
Шаг 3: Извлечение и нормализация цен
Парсер сопоставляет явный маркер и ожидаемую валюту. Для реального целевого сайта предпочтительнее использовать специфичный для сайта HTML-селектор или документированное структурированное поле данных, поддерживаемое образцами для цен на продажу, недоступных продуктов и нескольких вариантов. Никогда не берите первое число, похожее на валюту, на странице и не называйте его "ценой".
Шаг 4: Хранение истории цен в SQLite
Храните как действительные, так и отклоненные наблюдения. SQLite подходит для учебника с одним процессом и скромными нагрузками; больший монитор может потребовать транзакционную серверную базу данных и очередь рабочих. Таблица включает product_id, observed_price, currency, observed_at, source_url и extraction_status.
Шаг 5: Обнаружение значительных изменений цен
Для старой цены P₀ и новой цены P₁ абсолютное изменение составляет P₁ − P₀; процентное изменение составляет (P₁ − P₀) / P₀ × 100. Не рассчитывайте процентное изменение, когда базовый уровень равен нулю. Сравнивайте только значения с одинаковой валютой и вариантом продукта. Пример уведомляет при абсолютном изменении как минимум на 5 единиц валюты и относительном изменении как минимум на 3%; настройте оба порога в соответствии с вашим бизнесом.
Шаг 6: Запланируйте проверки и генерируйте уведомления
Запустите скрипт из cron, планировщика задач или вашей системы оркестрации. Этот пример выводит сообщение об уведомлении, которое окружающая служба может доставить. Запланированные задания и уведомления не являются функциями Crawl API. Записывайте ошибки обхода отдельно и повторяйте попытки временных сбоев с ограниченным временем ожидания.
import os
import re
import sqlite3
from datetime import datetime, timezone
from decimal import Decimal, InvalidOperation
from nstdata_ai_crawl import Format, NstDataClient, ScrapeRequestDto
DB_PATH ="prices.sqlite3"PRODUCTS =[{"product_id":"widget-standard","product_name":"Стандартный виджет","source_url":"https://shop.example.com/products/widget","currency":"USD",}]deffetch_markdown(client: NstDataClient, url:str)->str: result = client.submit_scrape_task_sync( ScrapeRequestDto( url=url, formats=[Format.MARKDOWN], onlyMainContent=True, timeout=60000,)) body = result.data.get_markdown()ifnot body ornot body.strip():raise ValueError("Нет доступного содержимого страницы продукта")return body
defparse_price(markdown:str, currency:str)-> Decimal:# Замените этот специфичный для цели маркер на протестированный парсер для вашего сайта. pattern =rf"(?m)^Цена:\s*{re.escape(currency)}\s+([0-9]+(?:\.[0-9]{{2}})?)\s*$" matches = re.findall(pattern, markdown)iflen(matches)!=1:raise ValueError(f"Ожидался один маркер цены {currency}, найдено {len(matches)}")try: amount = Decimal(matches[0])except InvalidOperation as exc:raise ValueError("Недопустимая десятичная цена")from exc
if amount <=0:raise ValueError("Цена должна быть положительной")return amount
definit_db(db: sqlite3.Connection)->None: db.execute("""
CREATE TABLE IF NOT EXISTS observations (
id INTEGER PRIMARY KEY,
product_id TEXT NOT NULL,
observed_price TEXT,
currency TEXT NOT NULL,
observed_at TEXT NOT NULL,
source_url TEXT NOT NULL,
extraction_status TEXT NOT NULL
)
""") db.commit()defprevious_price(db: sqlite3.Connection, product_id:str, currency:str): row = db.execute("""SELECT observed_price FROM observations
WHERE product_id = ? AND currency = ? AND extraction_status = 'ok'
ORDER BY id DESC LIMIT 1""",(product_id, currency),).fetchone()return Decimal(row[0])if row elseNonedefsave(db, product, observed_at, status, price=None): db.execute("""INSERT INTO observations
(product_id, observed_price, currency, observed_at, source_url, extraction_status)
VALUES (?, ?, ?, ?, ?, ?)""",( product["product_id"],str(price)if price isnotNoneelseNone, product["currency"], observed_at, product["source_url"], status,),) db.commit()defmain()->None:with sqlite3.connect(DB_PATH)as db: init_db(db)with NstDataClient(os.environ["NSTDATA_API_TOKEN"])as client:for product in PRODUCTS: observed_at = datetime.now(timezone.utc).isoformat()try: markdown = fetch_markdown(client, product["source_url"]) price = parse_price(markdown, product["currency"]) baseline = previous_price( db, product["product_id"], product["currency"])save(db, product, observed_at,"ok", price)if baseline isNone:print(f"Базовый уровень записан: {product['product_id']}{price}")continue delta = price - baseline
pct =abs(delta / baseline)*100if baseline else Decimal("0")ifabs(delta)>= Decimal("5")and pct >= Decimal("3"):print(f"ALERT {product['product_id']}: {baseline} -> {price} "f"{product['currency']} ({pct:.2f}%); "f"source={product['source_url']} at={observed_at}")except Exception as exc: save(db, product, observed_at,"error")print(f"ОШИБКА {product['product_id']}: {exc}")if __name__ =="__main__": main()
Для локальной проверки парсера перед любым сетевым вызовом, parse_price("Цена: USD 129.00", "USD") должен вернуть Decimal("129.00"). Он должен отклонить "Список цен: USD 129.00" и страницу с двумя маркерами Цена:. Производственный парсер нуждается в дополнительных фиктивных данных для скидок, символов валют, разделителей, специфичных для локали, и текста о нехватке товара. Запись crontab, такая как 0 */6 * * * /path/to/python /path/to/price_watch.py >> /path/to/price_watch.log 2>&1 выполняется каждые шесть часов; установите частоту в соответствии с вашими правами, бюджетом и потребностями в свежести.
Почему стоит использовать Nstdata Crawl для мониторинга цен?
Nstdata полезен в качестве слоя сбора, когда утвержденные публичные страницы продукта необходимо рендерить, повторно извлекать и обеспечивать последовательный вывод. Его задокументированный API одностраничного формата, выходные данные в Markdown и HTML, скриншоты, синхронные и асинхронные задачи, а также параметры местоположения прокси могут снизить объем кода для доступа к страницам, который вы поддерживаете. Эти возможности не обеспечивают надежное извлечение цены в каждом магазине. Парсер, база данных, планировщик и доставка уведомлений остаются вашей ответственностью. Руководство по автоматическому сбору данных от Nstdata предоставляет соответствующий операционный контекст.
Разделение позволяет вам сменить парсер страницы, не изменяя клиента сбора. Markdown удобен, когда цена видна в виде текста; HTML предпочтителен, когда вам нужно точное структурированное поле данных или DOM. Скриншот может помочь диагностировать визуальные несоответствия. Настройки региона прокси могут иметь значение, когда отображаемая валюта или предложение различаются в зависимости от местоположения, но географическое различие должно быть зафиксировано как часть ключа наблюдения, а не рассматриваться как изменение цены.
Пример интеграции Python SDK
fetch_markdown() выше является небольшим адаптером SDK. Для нового продавца сначала соберите несколько разрешенных образцов страниц и напишите тесты извлечения, специфичные для сайта. Только затем включайте запланированные проверки. Избегайте продвижения метрики "страница загружена" в метрику "цена успешно зафиксирована".
Тестирование, затраты и распространенные проблемы
Отслеживайте стоимость запросов Crawl, отдельно выставляемый счет за трафик прокси, если он используется, стоимость базы данных и планировщика, а также токены модели, если LLM пишет резюме. Полезный знаменатель - это действительные, правильно сопоставленные наблюдения цен, а не сырьевые запросы. Если количество повторных попыток увеличивается или извлечение не удается после изменения макета, стоимость за действительное наблюдение возрастает, даже если цена за единицу запроса остается фиксированной.
Распространенные ошибки и устранение неполадок
Для пустого содержимого проверьте состояние рендеринга страницы и ожидаемый селектор. Для 403/429 снизьте скорость и проверьте политику доступа, а не пытайтесь повторять запросы агрессивно. Для неправдоподобного скачка цены проверьте акцию, вариант, размер упаковки, валюту и изменения парсера. Используйте уникальный ключ наблюдения или уведомления, если планировщик может запуститься дважды, и убедитесь, что строка ошибки никогда не перезаписывает последний действительный базовый уровень.
Как измерить качество мониторинга
Меткой образца целевых страниц вручную. Точность извлечения - это правильные парсинги цен / распарсенные страницы. Коэффициент действительного сбора - это принятые наблюдения / попытки страниц. Точность обнаружения изменений - это истинные изменения / проверенные уведомления. Свежесть - это время от изменения страницы до зарегистрированного наблюдения; измерьте это с помощью контролируемых фиктивных данных или известных событий обновления. Коэффициент дублирования уведомлений - это повторяющиеся уведомления для одного и того же наблюдаемого изменения / все уведомления. Просматривайте их по продавцу и шаблону страницы, поскольку глобальная средняя величина может скрыть один сломанный парсер.
Читать разрешенные страницы продуктов, извлекать четко определенную цену, сохранять наблюдения с отметками времени, сравнивать с последней действительной записанной записью и предупреждать только после проверки.
Может ли API Crawl автоматически извлекать цены?
API Crawl извлекает содержимое страницы. Вам все равно нужен специфичный для сайта парсер или слой извлечения, чтобы определить правильную цену и вариант продукта.
Как часто следует проверять цены?
Выберите расписание из требований к свежести бизнеса, политики сайта, частоты изменений и стоимости. Измерьте, захватывает ли этот интервал изменения вовремя.
Как следует хранить исторические цены продуктов?
Используйте стабильный идентификатор продукта, десятичную сумму, валюту, исходный URL, время наблюдения, статус извлечения и любой ключ варианта или региона, необходимый для сравнения схожих объектов.
Ivy Lin
Oct. 22nd 2026
Попробуйте Nstproxy Crawl -
Начните Бесплатно Уже Сегодня
Сканируйте целые сайты одним API-запросом
Преобразуйте любой сайт в Markdown, HTML, JSON, ссылки, PDF и другие форматы без управления инфраструктурой сканирования.