Все статьи

Создание пайплайна обогащения B2B-данных о компаниях

Нужно ежедневно обогащать данные тысяч компаний из каталогов, сайтов и прессы? Вот как создать пайплайн обогащения B2B-данных, который не ломается каждую неделю.

Проблема

Вы создаете B2B SaaS продукт. Ваши клиенты загружают список названий компаний. Они ожидают получить чистую запись: диапазон выручки, количество сотрудников, технический стек, раунд финансирования, ключевые контакты, последние новости. Они ожидают получить это за минуты, а не дни. И они ожидают, что данные будут верными.

Данные существуют. Они лежат на Crunchbase, на страницах About компаний, на страницах компаний в LinkedIn, на Google Maps, на Glassdoor, в региональных бизнес-реестрах, в архивах TechCrunch. Проблема в том, чтобы надежно до них добраться.

Каждый источник ломается по-своему. Crunchbase отдает тяжелое клиентское приложение, которое перерисовывается, если подозревает бота. LinkedIn агрессивно применяет rate limit и меняет свой DOM быстрее, чем вы успеваете обновлять селекторы (один популярный пост в сообществе оценивает стандартный Python-скрейпер примерно в 50 профилей до появления антибот-защиты). Сайты компаний варьируются от статического HTML до single-page apps, которым нужен полноценный браузер даже для отображения контента. Региональные каталоги меняют верстку каждый квартал и скрываются за гео-блокировками. Согласно 2026 отраслевому отчету от GroupBWT, 10-15% краулеров в некоторых вертикалях требуют еженедельных исправлений просто для того, чтобы успевать за антибот-обновлениями и изменениями DOM.

В итоге ваш пайплайн обогащения начинается как чистая архитектура из пяти источников. Через шесть месяцев это клубок наполовину сломанных скрейперов, очередей повторных попыток и Slack-канала под названием #scraper-alerts, который больше никто не открывает (ранее мы писали о скрытой стоимости поддержки собственных скрейперов). Жалобы на качество данных накапливаются в очереди техподдержки. Ваша команда начинает шутить, что компанию следовало назвать "Пять скрейперов и молитва".

Подход

Забудьте о скрейперах на минуту. Сложная часть обогащения это не извлечение. Это маршрутизация: решение о том, какому источнику нужен какой инструмент, какой proxy, какая политика повторных попыток и что считать "хорошим" response.

Платформа вроде FourA дает вам три продукта, которые напрямую соответствуют трем классам источников, с которыми вы будете работать.

Статические HTML каталоги и реестры. Большинство региональных бизнес-реестров и множество старых B2B каталогов используют серверный рендеринг. Им нужен быстрый, легкий HTTP request с чистого IP. Это Single: один URL на входе, один response на выходе. Добавьте unblocker: true, и он пройдет через блокировки на уровне рукопожатия, которые намертво останавливают стандартный HTTP-клиент. Single автоматически маршрутизирует через Proxy Finder и возвращает proxy id на верхнем уровне response (r.proxy), чтобы ваши последующие вызовы могли передать его обратно как proxy:"<id>" для привязки к той же выходной ноде, когда нужна непрерывность сессии.

SPA с тяжелым JavaScript. Crunchbase, приложения в стиле LinkedIn и даже сайты компаний среднего размера не вернут нужные вам данные из обычного HTTP response. Они рендерятся на клиенте. Это Browser: полноценный браузер выполняет страницу, запускает JS и возвращает вам отрендеренный HTML, cookie и скриншоты. Как и Single, он маршрутизирует через Proxy Finder под капотом (отдельный шаг выбора с вашей стороны не требуется).

Смешанные источники с валидацией. Каждый request к API FourA принимает блок validate. Вы можете требовать определенные статус-коды, совпадения header или подстрок в теле. Если response является мягким отказом (страница 200 с CAPTCHA, пустая оболочка данных или промежуточный экран с извинениями), валидатор отклоняет его. Затем ваш пайплайн может вместо этого направить тот же URL через Browser. Эта единственная функция устраняет самый дорогой класс ошибок в обогащении: тихий сбой, который записывает мусор в вашу базу данных.

Вот как выглядит вызов к одному источнику:

curl -X POST https://api.foura.ai/api/single \
  -H "Authorization: Bearer pk_live_..." \
  -d '{
    "url": "https://registry.example.com/company/123",
    "unblocker": true,
    "followRedirects": 5,
    "validate": {
      "status": { "accept": [200] },
      "data":   { "fail":   ["captcha", "blocked", "access denied"] }
    }
  }'

А вот эквивалент Browser для сайта компании с тяжелым JavaScript:

curl -X POST https://api.foura.ai/api/browser \
  -H "Authorization: Bearer pk_live_..." \
  -d '{
    "url": "https://www.example-saas.com/about",
    "unblocker": true
  }'

Логика маршрутизации находится в вашем собственном пайплайне. Надежность в нашем. Вы решаете, какой из ваших источников получит какой инструмент. Мы следим за тем, чтобы инструмент действительно сработал.

Результаты

Мы наблюдали, как несколько команд перешли от внутренних скрейперов к пайплайну с маршрутизацией FourA во время публичной беты. Паттерн последователен (иллюстративные цифры основаны на том, что мы видели в бета-когорте):

  • Задержка обогащения снижается с 3-6 секунд на компанию до медианного значения менее 1.5 секунд на маршрутах cached-residential.
  • Уровень скрытых сбоев (response 200 с пустыми данными) падает примерно с 8% до менее 1%, как только блок validate перехватывает мягкие отказы до того, как они попадут в базу данных.
  • Инженерное время на поддержку скрейпера сокращается с 1-2 инженеров на полный рабочий день до Slack-канала, который в основном молчит.
  • Уровень успеха с первой попытки на защищенных каталогах поднимается до верхних пределов 90%, когда unblocker: true используется вместе с чистым proxy id.

Еще одна цифра, которую стоит отметить: мы видели, как корректность с первой попытки (правильные данные, правильная компания) отстает от успеха с первой попытки примерно на четыре пункта. Урок не в том, что скрейпинг это сложно. А в том, что вам все равно нужно валидировать запись на соответствие компании, о которой вы действительно запрашивали данные (мы писали об этом паттерне в почему ваш веб-скрейпер постоянно ломается).

Цифры, которые имеют значение, это не размер пула proxy или количество request. Это частота, с которой ваш endpoint обогащения возвращает правильные данные с первой попытки, и наклон вашего графика обслуживания скрейпера за следующие шесть месяцев.

Ключевой вывод

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

Узким местом никогда не был источник. Это была маршрутизация: выбор правильного инструмента, правильного proxy, правильного правила валидации для каждого URL, каждый раз. Постройте этот слой один раз, передайте его тому, что уже это делает, и ваша команда сможет потратить вторник на продукт, а не на устранение поломок селекторов.