Инструменты и Автоматизация

Parser Combine: как мы построили комбайн для сбора бизнес-контактов из 8 источников

Михаил Шувалов
27 июля 2026
~10 мин чтения

Когда я говорю «парсинг», большинство представляет строчку curl | grep. Реальность сложнее.

Google Maps отдаёт данные через JavaScript, Яндекс.Карты требуют Selenium с обходом детекта, 2GIS банит после десятого запроса, а EGRUL возвращает максимум 2000 записей за раз. Собрать 500 контактов автосервисов Москвы с телефонами, сайтами, email'ами и ФИО руководителя — это не curl. Это 8 разных движков, работающих параллельно.

Зачем мы это построили

B2B-продажи начинаются с контактов. Менеджер открывает 2GIS, копирует телефоны, потом Яндекс.Карты — смотрит рейтинг, потом EGRUL — проверяет ИНН. Три вкладки, час работы, 30 контактов. Данные разрознены: Яндекс даёт рейтинг, 2GIS — телефон и часы работы, EGRUL — ОГРН и выручку. Ни один источник не даёт полную картину.

Готовые SaaS закрыты. Ты не можешь залезть под капот, не можешь добавить свой источник, не можешь кастомизировать экспорт. Ты платишь $50-200 в месяц и надеешься что их прокси не забанят через неделю.

Мы решили построить свой комбайн. Открытый, расширяемый, заточенный под русский/CIS рынок. 528 Python-модулей спустя — вот что получилось.

Стек и архитектура

Ядро — Python 3.12 с asyncio. Почему не Scrapy? Scrapy хорош для простого HTTP-скрапинга, но ломается на JavaScript-рендеринге. А Google Maps и Zoon — чистый JavaScript. Выбор пал на связку Playwright + Selenium + aiohttp.

Ключевые решения:

Пайплайн обработки:

# Pipeline: 8 источников → ... → CRM-экспорт
Google Maps Yandex Maps 2GIS Zoon Avito HH.ru EGRUL Telegram
↓ asyncio.gather (параллельно, с семафором)
→ нормализация (телефоны/email/адреса к единому формату)
→ дедупликация (MD5 fingerprint + fuzzy matching)
→ OSINT-обогащение (7 модулей параллельно)
→ лид-скоринг (A/B/C/D)
→ экспорт (CSV/XLSX/JSON)

9 источников — 9 стратегий обхода защиты

Каждый источник парсится по-своему. Нет универсального подхода.

ИсточникДвижокСложностьЧто даёт
Google MapsPlaywright + regexВысокаяНазвание, адрес, телефон, сайт, рейтинг, категория
Yandex MapsSelenium + CSSВысокаяНазвание, адрес, телефон, сайт, рейтинг, отзывы
2GISAPI + Selenium fallbackСредняяНазвание, телефон, сайт, часы работы, категория
Zoon.ruPlaywright + regexСредняяНазвание, телефон, сайт, рейтинг
AvitoPlaywrightВысокаяОбъявления, цены, категории
HH.ruREST APIНизкаяВакансии, зарплаты, скиллы
EGRULrequests (API)НизкаяИНН, ОГРН, выручка, дата регистрации
OKVEDAPI + классификаторСредняя600+ кодов ОКВЭД, поиск компаний по отрасли
Telegramt.me/s scrapingНизкаяЗаказы на сайты из фриланс-каналов

Главная боль — Google Maps. После 3-5 запросов без маскировки прилетает капча, а через 10 — блокировка по IP. Каждый запрос должен выглядеть как человеческий. Случайная задержка 0.5-3 секунды с джиттером ±50%. Рандомный User-Agent из пула. Прокси ротируется при первых признаках блокировки.

Anti-detection: 4 слоя защиты

Промышленный парсинг — это гонка вооружений. Платформы защищаются, мы обходим.

Слой 1: Browser Fingerprint

undetected-chromedriver патчит Chrome чтобы скрыть автоматизацию. selenium-stealth маскирует WebDriver-флаги, navigator.webdriver, headless-режим. Playwright конфигурируется с реалистичными viewport, language, timezone. Отдельный контекст браузера на каждый источник — чтобы fingerprint не переиспользовался.

Слой 2: Прокси-ротация

Бесплатные прокси умирают быстро. Мы написали автосборщик — он собирает прокси из 8 публичных источников, валидирует их (latency + проверка через api.hh.ru), отбрасывает мёртвые. При 3 фейлах подряд прокси уходит в blacklist. Живые сортируются по latency — быстрейшие идут в начало очереди.

Слой 3: Поведенческий джиттер

Робот делает 50 запросов в секунду с интервалом ровно 1.0с. Человек — 5 запросов с интервалами 0.7с, 1.3с, 2.1с, 0.5с, 1.8с. Разница — это джиттер. Каждая задержка умножается на случайный коэффициент от 0.5 до 1.5. Плюс случайные «паузы на подумать» каждые 10-15 запросов.

Слой 4: Капча

Интеграция с rucaptcha/2captcha. Автоматический разбор reCAPTCHA v2, hCaptcha, изображений. До 3 попыток с увеличивающейся задержкой при ошибке. Если капча появляется слишком часто — источник временно отключается через Circuit Breaker.

OSINT-обогащение: 7 модулей в параллель

Собрать контакты — полдела. Их надо обогатить. После сбора карточка компании прогоняется через 7 OSINT-модулей:

Плюс LPR (поиск ФИО руководителя через nalog.ru) — критично для B2B: звонить не на ресепшен, а директору. И DaData для стандартизации адресов.

Лид-скоринг

500 контактов — это много. Какие горячие? Система скоринга оценивает каждый по 7 факторам:

Результат — 4 тира: A (80+, Hot) — телефон + сайт + email + ИНН + LPR, готов к звонку. B (60-79, Warm) — телефон + сайт, можно работать. C (40-59, Cold) — только телефон, нужен дообзвон. D (<40, Research) — минимум данных, на исследование рынка.

Экспорт в CRM-формате: колонки Company, Phone, Website, Email, Address, INN, Decision Maker, Position, Rating, Reviews. Готово к загрузке в любую CRM.

15 подпроектов

Кроме ядра, в проекте живут 15 самостоятельных парсеров. Каждый можно запустить отдельно:

Бизнес-применение

Допустим, ты продаёшь CRM для автосервисов. Твоя задача — найти все автосервисы Москвы с телефонами, сайтами и email'ами.

Ручной сбор: Открываешь 2GIS → вбиваешь «автосервис Москва» → копируешь первые 30 контактов. Потом Яндекс.Карты — ещё 20. Потом Гугл — ещё 15. 3 часа. Часть телефонов в разном формате, часть сайтов битая. Данные не склеены.

Parser Combine: Одна команда в CLI: python run.py search "автосервис" --city "москва" --max 200 --export csv. 5 минут — 500+ контактов с телефонами, сайтами, email'ами, рейтингами, ИНН. Данные склеены, дедуплицированы, отсортированы по качеству. Экспортированы в CSV для CRM.

Экономия: 3 часа → 5 минут. 30 контактов → 500+.

Заключение

Парсинг — это инфраструктура для продаж. Как CRM, как телефония, как email-рассылка. Если ты в B2B, тебе нужен поток контактов. И либо ты платишь $200/мес за закрытый SaaS с чужими прокси, либо строишь свой комбайн.

Мы построили свой. 528 Python-модулей. 9 источников. 7 OSINT-модулей. 15 подпроектов. Docker из коробки. Он работает, расширяется и не зависит от вендора.

Если вам нужна автоматизация сбора данных — посмотрите кейс или напишите мне. Разберём вашу задачу.