Часть 2. Путь от простого поисковика по своей базе до инструмента, с помощью которого можно облегчить себе жизнь при работе с конкурентами/поставщиками, да и в общем отслеживать свою товарную нишу.
Меня зовут Евгений. Если вы читали мою первую статью, то знаете, как я, не написав ни строчки профессионального кода, создал с помощью Gemini ИИ-поисковик для нашего сложного ассортимента спецодежды. Это был первый опыт внедрения ИИ в реальные бизнес-процессы. Инструмент заработал, и я мог бы на этом остановиться. Но пытливый ум вел меня дальше. Хотя, в данном случае даже не пытливый ум, а скорее анализ «хотелок» в компании. Вот об этих хотелках и о том, что из этого вышло, я и расскажу.
Эта статья — не о решении проблемы, а о расширении возможностей моего инструмента. Это рассказ о том, как мой внутренний инструмент планомерно эволюционировал в мини-платформу Market Intelligence (это название я узнал уже по факту реализации от того же Gemini). В моем случае это связка «Парсер + Подбор по сторонним данным + Анализ цен». Я хочу не просто поделиться историей, но и на пальцах разобрать логику каждого модуля. Про код рассказывать не буду, так как я не программист, и это в моем случае неуместно. Моя цель — показать, как устроен инструмент, какие бизнес-задачи он решает, и как вы можете применить его в своей нише. В общем, это история о том, как не-программист, вооруженный современным ИИ, может реализовать нужный инструмент.
Первая версия моего приложения эффективно решала задачу внутреннего поиска. Она позволяла быстро находить товары по сложным запросам (а иногда и по запросам, рожденным больной фантазией сотрудников), что значительно ускорило работу менеджеров и адаптацию новичков. Есть данные, есть каша в голове неопытного менеджера, нужен результат. Мой инструмент как раз и помогал с этим, работая как замкнутый контур исключительно с нашими внутренними данными.
Однако бизнес-процессы не ограничиваются внутренними операциями. Успех на рынке во многом зависит от того, насколько хорошо компания ориентируется во внешней среде: предложениях конкурентов, ценовой политике поставщиков и общих трендах. Знание собственного ассортимента — это необходимый базис, но для развития требуется понимание всего рынка.
Эта идея и стала отправной точкой для разработки второй версии. Я поставил перед собой цель расширить функционал, чтобы приложение могло стать полноценным инструментом для анализа внешнего рынка. Задачи в моей голове были сформулированы следующим образом: нужно было научить систему агрегировать и унифицировать данные из внешних источников, автоматизировать сбор данных с веб-сайтов, создать аналитический модуль для отслеживания изменений и, наконец, интегрировать все это в существующий интерфейс, сохранив простоту использования.
Эта концепция легла в основу трех новых, взаимосвязанных модулей, которые превратили инструмент подбора по внутренним позициям в более универсальную аналитическую платформу.
Подбор по сторонним данным — решение проблемы унификации

После успешного запуска внутреннего поисковика возникла следующая логическая задача: расширить его возможности для работы с внешними данными. Необходимо было научить систему искать не только по собственному каталогу, но и по прайс-листам поставщиков и конкурентов. Это позволило бы оперативно подбирать аналоги, сравнивать коммерческие условия и получить более полное представление о рынке.
Начальная гипотеза заключалась в простом добавлении новых файлов в систему. Однако на практике это оказалось нереализуемым. Анализ нескольких прайс-листов от разных компаний выявил фундаментальную проблему — полное отсутствие стандартизации данных. Уникальный идентификатор товара мог называться "Код номенклатуры", "ID товара" или просто "Арт.". Цены были представлены в различных форматах: "5 000,00 руб.", "5000.00", "5,000.00", а иногда и в виде текстового поля "Цена по запросу". А важные характеристики, такие как материалы или технические спецификации, часто были объединены в одной ячейке с описанием.
Стало очевидно, что требование вручную приводить каждую новую таблицу к единому стандарту свело бы на нет всю пользу от автоматизации. Решение должно было быть гибким, масштабируемым и не требующим от конечного пользователя глубоких технических знаний. Так был спроектирован модуль, основная задача которого — автоматическая унификация и обработка данных.
Как это работает? Пошаговая логика.
Весь процесс работы модуля разделен на два основных этапа: подготовка и индексация данных, которая выполняется один раз при добавлении новых файлов, и процесс поиска, с которым пользователь взаимодействует ежедневно.
На этапе подготовки происходит преобразование разнородных файлов в единую, стандартизированную структуру. Все начинается с того, что пользователь просто помещает один или несколько прайс-листов в специальную папку. Дальше система все делает сама. Сначала происходит автоматическое распознавание схемы, или маппинг. Система считывает каждый файл и анализирует названия его колонок. Затем она обращается к настраиваемому "словарю сопоставления" в формате JSON, где для каждого стандартного внутреннего поля (например, code для артикула) прописан список возможных синонимов. Так система определяет, какая колонка содержит артикулы, какая — цены, и так далее, игнорируя все лишнее.
После распознавания следует этап трансформации и очистки. Для каждого исходного файла создается новая, виртуальная таблица со стандартной структурой. Данные из распознанных колонок копируются в стандартные поля: product, code, price, description. На этом же шаге цена из текстовой строки "1 234,56 руб." преобразуется в числовой формат 1234.56, а из текстовых полей удаляются лишние пробелы и служебные символы. К каждой строке с товаром добавляется мета-информация — имя исходного файла, что позволяет в результатах поиска всегда видеть источник данных.
Когда данные очищены, они отправляются на создание поискового индекса. Чтобы поиск был не просто сравнением строк, а интеллектуальным процессом, все текстовые поля проходят через лемматизацию с помощью библиотеки Natasha. Этот процесс приводит все слова к их базовой словарной форме. Это позволяет системе находить релевантные товары, даже если в запросе используются другие формы слов. Наконец, итоговая, обработанная таблица со всеми товарами от всех внешних источников кешируется. Она сохраняется в единый, оптимизированный для быстрого чтения бинарный файл (это как мне объяснил сам Гемини), что обеспечивает высокую скорость отклика при последующих запусках.
Когда вся подготовительная работа завершена, пользователь может приступать к процессу поиска. Этот процесс для него выглядит так же, как и при поиске по внутренней базе, но "под капотом" происходит сложная цепочка событий. Если вы читали мою предыдущую статью, то можете пропустить 3 абзаца ниже. Для тех, кто не читал, расскажу кратко.
Пользователь вводит в строку поиска запрос: "костюм сварщика летний брезент". Сначала этот запрос отправляется на анализ и расширение в ИИ-модель "Помощник". Gemini разбивает его на смысловые группы (концепции) и подбирает синонимы. С этим расширенным набором ключевых слов система переходит к первичному отбору кандидатов. Она производит очень быстрый локальный поиск по своему проиндексированному кешу, отсеивая 99% ненужных товаров и формируя список потенциальных "кандидатов" с предварительной оценкой релевантности.
Далее в дело вступает финальное ИИ-ранжирование. Лучшие 20-40 товаров из списка кандидатов отправляются на повторную, уже более глубокую оценку в ИИ-модель "Ранжировщик". Важно, что в ИИ отправляется не весь каталог, а только небольшая выборка. Модель получает не просто список товаров, а и исходный запрос пользователя с инструкцией. Именно на этом этапе происходит основной подбор, так как ИИ понимает семантическую связь и может поставить на первое место товар с фразой "предназначен для использования в жаркое время года" по запросу "летний".
Чтобы пользователь не просто получил список, а понял, почему система выбрала именно эти товары, для лучших 5 позиций запускается генерация ИИ-отчета. ИИ-модель "Эксперт" получает полные данные о товаре и запрос клиента с инструкцией, что именно нужно указать в отчете. В итоге пользователь видит не скучную таблицу, а интерактивные карточки найденных товаров с ключевой информацией и ценным ИИ-анализом, который объясняет релевантность выбора.
Здесь мы получаем результат с описанием и сравнительным анализом. То есть я получаю информацию, сразу с ссылками, артикулом, ценами и прочей нужно информацией. То есть, если собрать достаточно большое количество данных, то можно оперативно изучить рынок на наличие необходимого товара без ручного поиска по интернету или прайсам поставщиков. Тут мы плавно подошли к одному из очень важных вопросов «как собрать эти данные в большом количестве и быстро
Парсер сайтов — с помощью искусственного интеллекта

После успешной реализации модуля для обработки файлов стало очевидно, что это лишь часть решения. Наиболее ценная и актуальная информация — цены, наличие, акции, новинки — находится непосредственно на сайтах конкурентов и поставщиков. Эти данные редко предоставляются в виде удобных для скачивания файлов. Чтобы оставаться в курсе рыночной ситуации, необходимо было научить мой инструмент собирать информацию прямо из ее первоисточника и дело в том виде, в котором мне удобно эту саму. информацию далее обрабатывать. Так я приступил к разработке модуля веб-парсинга.
Как это работает?
Ранее у меня уже был опыт парсинга с помощью других инструментов (Zennoposter, Content Downloader), я даже что-то делал на PHP (но это не точно). Хорошие когда-то были времена: парсим, перерабатываем и получаем трафик. Но сейчас не об этом.
Я понимал, что не существует универсального скрипта, который мог бы "читать" все сайты одинаково. Каждый сайт имеет свою уникальную структуру и методы защиты. Где-то работают простые GET-запросы, где-то нужно парсить HTML, а где-то — эмулировать действия в браузере. Моей задачей было собрать все это в один инструмент, который мог бы адаптироваться к любому типу контента.
Весь процесс делится на три логических этапа: Подготовка и настройка, Автоматический сбор данных и Формирование результата.
На этапе подготовки и настройки пользователь, не обладая техническими знаниями, фактически создает уникальную программу для парсинга конкретного сайта. Первым делом необходимо определить источники — составить список страниц для сбора данных. Простой путь — это ручной ввод ссылок. Но если товаров тысячи, это неэффективно. Поэтому основной путь — автоматический поиск через Sitemap (в статье буду рассматривать только работу во вкладке парсинг по сайтмеп, так как принципиально работа инструментария отличается только как мы собираем ссылки). Пользователь указывает ссылку на "карту сайта" (sitemap.xml), и система скачивает ее. Чтобы отделить "зерна от плевел", этот огромный список URL отправляется в ИИ-модель, которая получает четкую инструкцию отфильтровать только те ссылки, которые похожи на страницы товаров, и удалить все служебные. Так из нескольких тысяч ссылок система получает точный (ну или почти точный) список целевых страниц товаров. СРАЗУ оговорюсь, парсить моим инструментом я могу не только страницы товаров (статьи, контакты и прочее)
С помощью ИИ мы получаем список URLов, которые отвечают нашим заданным требованиям
Далее пользователь определяет поля для сбора, просто перечисляя в текстовом поле, какую информацию он хочет получить: "Наименование товара", "Артикул", "Цена" и так далее (может быть пользователь захочет спарсить метатеги, ссылки на картинки и прочее).

После этого наступает ключевой и самый технологичный шаг — генерация кода для парсинга с помощью ИИ. Пользователь нажимает кнопку "Подобрать алгоритм". Система автоматически скачивает HTML-код первой страницы из списка и отправляет его в Gemini вместе с перечнем полей и специальной инструкцией. ИИ анализирует структуру HTML-документа, находит, в каких тегах и классах содержится нужная информация, и генерирует готовый, работающий Python-код. Этот код система сохраняет в памяти для дальнейшего использования. Таким образом, сложнейшая часть парсинга полностью автоматизируется.
Наконец, пользователь выбирает режим загрузки страниц в зависимости от сложности сайта (об этом я подробно не рассказал, здесь будет вкратце):
Стандартный режим: Быстрый и экономичный, отправляет прямой HTTP-запрос. Идеален для простых, статичных сайтов. В данном случае все было просто и при разработке все «завелось» практически с самого начала
А вот далее мне пришлось попотеть. Мне интересно было парсить ВБ и Озон (исключительно для ознакомления это делал), ну как вы поняли первые попытки были неудачными. Динамическая подгрузка контента не давала мне спокойно жить. Теоретически я понимал, как это нужно сделать, но отсутствие знаний программирования на python играло не в мою пользу. Я не знал, как эмулировать браузер, и повозиться пришлось достаточно долго. Решение пришло с библиотекой Selenium. Путем проб и ошибок, а главное путем постоянного тестирования пришло готовое решения из 2 вариантов Selenium:
Режим Selenium (Standard): Необходим для сайтов, где контент подгружается динамически с помощью JavaScript. Запускает управляемый браузер, который дожидается полной загрузки страницы.
Режим Selenium (Undetected): "Стелс-режим" для сайтов с продвинутой защитой от ботов. Маскирует браузер под действия обычного пользователя, что позволяет обходить большинство блокировок.
Когда все настроено (мы отобрали ссылки с помощью ИИ, задали нужные данные, сделали предварительный парсинг)
Начинается автоматический сбор данных. Пользователь нажимает кнопку "Запустить полный парсинг". Система запускает конвейер, который последовательно обрабатывает каждую ссылку, используя выбранный режим и сгенерированный ИИ код для извлечения данных. Для ускорения процесса используется многопоточность. Результаты по каждой странице постепенно накапливаются, а пользователь в реальном времени видит прогресс-бар.
На финальном этапе происходит формирование и выгрузка результата. Все собранные данные собираются в единую таблицу pandas DataFrame, которая отображается в интерфейсе для предварительного просмотра. Рядом находятся кнопки для скачивания результата в форматах .xlsx или .csv. Эти файлы полностью готовы для дальнейшего использования: их можно загрузить в модуль «Анализ цен» или «Подбор по сторонним данным» (о котором я писал выше в статье). То есть я получил инструмент, который может практически без технических знаний парсинга собрать информацию с сайтов производителя/конкурента/поставщика, и тут же использовать эти данные для подбора товара по ним.
Анализ динамики цен с помощью Python

Сбор данных с помощью модуля парсинга является первым шагом в процессе анализа рынка. В результате мы получаем массивы информации о предложениях конкурентов и поставщиков, которые на этапе парсинга можно еще структурировать и очищать. Однако сами по себе эти данные, представляющие статический срез рынка на определенный момент времени, имеют ограниченную ценность (ну как минимум можно подбирать товар по своим запросам). Конкурентное преимущество дает анализ этих данных во времени, то есть понимание происходящих изменений. Именно для решения этой задачи и был спроектирован модуль "Анализ цен". Его цель — сделать анализ цен.
Как это работает? От сравнения наборов данных к визуализации.
В основе модуля лежит алгоритмическое сравнение двух или более наборов данных за разные периоды времени. Весь процесс выстроен в виде последовательного конвейера, состоящего из трех логических этапов.
На этапе загрузки и подготовки данных система собирает все исторические данные в единую структуру, пригодную для сопоставления. Процесс начинается с выбора и загрузки файлов пользователем. В интерфейсе он загружает как минимум два файла, которые представляют собой срезы данных за разные даты. Важным требованием является именование файлов таким образом, чтобы их можно было отсортировать в хронологическом порядке. Система использует имена файлов для их автоматической сортировки. Далее пользователь указывает, какая колонка содержит уникальный идентификатор товара, а какая — цену.
После этого происходит самый важный шаг подготовки — последовательное объединение данных. Система обрабатывает отсортированные файлы один за другим, чтобы построить единую "историческую" таблицу. Она берет самый старый файл, извлекает из него ключевые колонки и переименовывает колонку с ценой, добавляя к ней дату. Эта таблица становится основой. Затем следующий файл аналогичным образом объединяется с уже созданной таблицей по колонке-ключу. Для объединения используется метод "внешнего соединения" (outer join в pandas), который гарантирует, что в итоговую таблицу попадут все товары, даже те, что присутствуют только в некоторых файлах.
На этапе анализа и расчета изменений система анализирует построенную таблицу и вычисляет все произошедшие изменения. Сначала происходит определение периодов для сравнения. Алгоритм автоматически находит в таблице две последние по дате колонки с ценами, по которым и будет рассчитываться динамика. Затем для каждого товара рассчитывается процентное изменение цены и результат записывается в новую колонку.
Далее следует ключевой аналитический шаг — присвоение статуса изменения. Для каждого товара система определяет, какое именно событие с ним произошло, с помощью набора логических правил:
"Новый товар" присваивается, если в колонке со старой ценой значение отсутствует, а в новой — присутствует.
"Товар исчез" присваивается в обратной ситуации.
"Цена выросла", "Цена снизилась" или "Без изменений" — в зависимости от сравнения старой и новой цены.
В результате этого этапа таблица обогащается двумя новыми, аналитическими колонками: "Изменение, %" и "Статус (Финальный)".
Финальный этап — визуализация и выгрузка отчета. Система строит отчет, располагая колонки в логическом порядке, и применяет условное форматирование. Ячейки в колонке "Статус" раскрашиваются в зависимости от значения: "Цена выросла" — в красный, "Цена снизилась" — в зеленый, "Новый товар" — в голубой. Ячейки в колонке "Изменение, %" получают фоновый градиент от зеленого до красного. В итоге отформатированная таблица отображается в интерфейсе как наглядный аналитический дашборд. Рядом с ним расположена кнопка, позволяющая скачать этот отчет в формате .xlsx для дальнейшей обработки. ЕСЛИ ВКРАТЦЕ, то Анализ и сравнение цен – это автоматический ВПР в эксель с таким же автоматическим форматированием и добавлением некоторых данных. Да, это все можно сделать вручную, но я сделал это все в более удобном виде и в едином цифровом пространстве.
Заключение: От внутреннего проекта к универсальной платформе
В результате, проект, который начинался как внутренний инструмент для решения узкой задачи поиска по своей базе товара, эволюционировал в многомодульную аналитическую платформу (ну по крайней мере, я так думаю). Этот процесс показал, насколько эффективным может быть современный ИИ, приложив небольшое количество усилий.
Созданное решение является не узкоспециализированным инструментом, а достаточно гибкой платформой. Думаю, я еще вернусь к написанию статьи, как и где можно еще использовать данный инструмент. Но уже сейчас можно, как минимум, делать конкурентный анализ в разных нишах с небольшими настройкам, будь то продажи автозапчастей и электроники или строительных материалов.
Ключевая особенность архитектуры заключается в том, что вся основная логика — правила сопоставления колонок, инструкции для ИИ-моделей, настройки парсера могут управляться пользователем. Управление ими осуществляется через простой административный интерфейс. Это означает, что для адаптации системы под специфику нового рынка не требуются навыки программирования; необходимы лишь экспертные знания в предметной области. Пользователь может самостоятельно настраивать систему для понимания новых форматов данных и новых сайтов.
Эта гибкость и стала причиной, по которой было решено представить инструмент широкой аудитории. Это не просто набор скриптов, а решение, которое может быть полезно малому и среднему бизнесу. Оно предоставляет доступ к технологиям автоматического сбора и анализа данных, которые ранее были прерогативой крупных корпораций с собственными IT-отделами. Основная ценность такого инструмента — это показать возможность для компаний, а также для людей, которые могут своими руками реализовать необходимые инструменты.
Оригинал моей статьи
Благодарю всех за уделенное время на прочтение моей статьи!