Кейс / собственная инженерная система

Web Discovery Engine: автоматический поиск компаний по технологическим признакам

Система сама получает поток доменов, проверяет сайты, применяет сменные fingerprint-профили, сохраняет доказательства и контакты, исключает повторы и продолжает поиск batch за batch без участия оператора.

web discovery fingerprints Python worker 5k batches evidence-first

Проблема

Нужной базы компаний может просто не существовать

Если потенциального клиента определяет не ОКВЭД или готовый каталог, а конкретный технологический признак сайта, покупка очередной базы почти не помогает. Ручной сбор доменов и загрузка TXT/CSV тоже быстро становится узким местом.

Решение

Искать не компании по списку, а признаки по потоку сайтов

Источник доменов отделён от scanner: discovery постоянно формирует кандидатов, очередь отвечает за повторы и состояние, а detector registry решает, что именно искать на сайте.

Architecture

Один конвейер, разные поисковые профили

Система не привязана к одному CRM-продукту. Меняется detector и правила confidence, а discovery, очередь, HTTP-слой, enrichment и хранение результата остаются теми же.

01

Discovery

Получить поток доменов из внешних источников и отфильтровать нужные зоны.

02

Dedupe / queue

Не ставить в очередь недавно проверенные сайты и не дублировать активные прогоны.

03

HTTP scanner

Проверить сайт, пройти допустимые redirect и получить страницу без зависания всего batch.

04

Detector registry

Применить выбранный fingerprint-профиль и сохранить не только итог, но и подтверждающие evidence.

05

Enrichment

Достать доступные контакты и контактную страницу, не превращая scanner в отдельный crawler.

06

Results

Сохранить историю прогонов, confidence, признаки, ошибки и найденные компании для дальнейшей работы.

Detector profiles

Не только Bitrix24

Первый рабочий профиль был построен вокруг Bitrix24, но архитектурно это только один detector. Для другой задачи подключается другой набор признаков — без переписывания остального pipeline.

CRM и коммуникации

Ищем характерные загрузчики, JS-маркеры, публичные endpoints, cookie и другие признаки клиентских CRM-виджетов.

Bitrix24 amoCRM виджеты форм онлайн-чат callback

CMS и site builders

Профиль может собираться из HTML, путей к статике, generator/meta, характерных API и структуры ресурсов.

1C-Битрикс WordPress Tilda WooCommerce

E-commerce и marketing stack

Можно искать не только продукт, но и класс бизнеса: интернет-магазин, calltracking, формы захвата или нужную связку сервисов.

магазин checkout analytics calltracking

Собственный fingerprint

Для узкой задачи подключается отдельный detector с набором независимых evidence и собственным порогом уверенности.

JS/CSS headers cookies endpoints

Примеры выше показывают классы поисковых профилей. Конкретный detector включается под цель поиска и должен опираться на проверяемые публичные признаки, а не на догадку по одному совпадению.

Current runtime

Из ручного файла — в автономный bounded-процесс

Текущая версия уже не требует вручную готовить список на каждый прогон: worker набирает следующую порцию доменов и продолжает работу автоматически.

5 000доменов в одном bounded batch
autoследующий batch без ручного запуска
180 дн.типовое окно исключения повторов, настраивается
evidenceрезультат объясним набором найденных признаков

Engineering

Что оказалось важнее самого fingerprint

Поиск на тысячах сайтов ломается не на одной регулярке. Реальные проблемы — длинные redirect, недоступные сайты, повторные домены, read-only окружение, зависшие worker'ы и необходимость продолжить процесс после ошибки.

  • bounded batches вместо одного бесконечного процесса
  • автоматическая цепочка batch → batch и ручной stop-кран
  • dedupe между историей и активными прогонами
  • retry, timeouts и изоляция ошибки одного сайта от всего batch
  • нормализация патологически длинных redirect URL перед записью
  • отдельный worker под systemd и writable cache при read-only приложении
  • confidence по нескольким признакам вместо бинарного «нашёл строку / не нашёл»

Результат

Получился не «парсер сайтов», а переиспользуемый discovery-контур

Оператор задаёт цель поиска, после чего система может последовательно обрабатывать bounded-партии сайтов, не возвращаясь к ручной подготовке файлов. Новый профиль поиска добавляется на уровне detector'а, а инфраструктура вокруг него уже остаётся готовой.

В кейсе намеренно нет обещаний по «конверсии базы»: полезность конкретного профиля определяется уже на реальном потоке сайтов и подтверждённых evidence.