Разработка системы парсинга веб-сайтов
Парсинг — это не просто «скачать HTML и вытащить теги». Промышленная система сбора данных включает управление очередями запросов, ротацию прокси, обход антибот-защит, нормализацию данных и надёжное хранение. Один раз написанный скрипт на Beautiful Soup — это не система, это скрипт. Разница становится очевидной через неделю работы.
Из чего состоит полноценная система
Планировщик и очередь задач. Celery с Redis или RabbitMQ в качестве брокера. Каждый URL — отдельная задача с приоритетом, retry-политикой и TTL. Scrapy-cluster или собственный оркестратор координирует несколько воркеров.
Загрузчик страниц. Два режима:
- Статические страницы — httpx с async, connection pooling, keep-alive
- JavaScript-рендеринг — Playwright (предпочтительно) или Puppeteer, headless Chromium с управлением профилями браузера
Ротация идентификаторов. Пул прокси (residential или datacenter в зависимости от цели), смена User-Agent из реальных fingerprint-датасетов, случайные задержки с нормальным распределением, управление куки-сессиями.
Извлечение данных. CSS-селекторы или XPath — для стабильных структур. Для сложной логики — parsel (обёртка над lxml). Если структура нестабильна — LLM-экстракция через OpenAI или локальную Ollama с few-shot промптами.
Хранение и нормализация. Raw HTML в S3/MinIO для повторной обработки. Извлечённые данные — PostgreSQL или ClickHouse (если нужна аналитика по миллиардам записей). Дедупликация по URL-хешу + content-hash.
Антибот-защиты и как с ними работать
| Защита | Метод обхода |
|---|---|
| Rate limiting | Адаптивные задержки, распределение по IP |
| CAPTCHA (reCAPTCHA v2/v3) | 2captcha/Anti-Captcha API или обучение собственной модели |
| Cloudflare Bot Management | Playwright с реальным fingerprint, TLS fingerprint (циклическая ротация) |
| JavaScript challenges | Headless browser с полным выполнением JS |
| Honeypot-ссылки | Фильтрация невидимых элементов перед обходом |
| IP reputation blocks | Residential proxy (BrightData, Oxylabs, Smartproxy) |
Cloudflare с настройкой «Bot Fight Mode» — наиболее сложный кейс. Решение: Playwright с настоящим Chromium, обход через puppeteer-extra-plugin-stealth или playwright-stealth, имитация мышиных движений через CDP.
Архитектура для высоконагруженного парсинга
[Scheduler] -> [Redis Queue] -> [Fetcher Workers x N]
|
[Parser Workers x M]
|
[Raw Store S3] + [DB Writer]
|
[Monitor / Dashboard]
Fetcher и Parser — разные воркеры с разными требованиями к ресурсам. Fetcher — I/O bound, можно 100+ async задач на одном процессе. Parser — CPU bound, один процесс на ядро.
Мониторинг качества данных. Great Expectations или самописные проверки: процент непустых полей, диапазоны числовых значений, уникальность идентификаторов. При деградации качества — алерт в Slack/Telegram и пауза воркеров.
Правовые и этические аспекты
Перед запуском системы: проверка robots.txt, анализ ToS сайта, оценка нагрузки на целевой сервер. Для публичных данных это обычно приемлемо. Для закрытых разделов — требуется явное разрешение.
Стек и сроки реализации
Python-стек: Scrapy / httpx + parsel, Playwright, Celery, PostgreSQL/ClickHouse, MinIO.
Сроки по этапам:
- Базовый парсер одного сайта — 3-5 дней
- Очередь + ротация прокси + retry — 5-7 дней
- JS-рендеринг + антибот-обход — 7-14 дней
- Мониторинг, нормализация, хранение — 5-10 дней
- Полная система под 10+ источников — 4-8 недель
Сценарии использования
Мониторинг конкурентов. Цены, ассортимент, наличие товаров — сбор раз в час с историей изменений.
Агрегация объявлений. OLX, Avito-подобные площадки: десятки тысяч записей в сутки, дедупликация, геокодирование адресов.
Исследовательские задачи. Сбор датасетов для ML, мониторинг тональности упоминаний бренда, анализ SEO-позиций конкурентов.
Контентные проекты. Синдикация новостей, агрегация вакансий, сборка каталогов из открытых источников.
Обслуживание системы
Веб-сайты меняются — парсер ломается. Нужна стратегия обнаружения поломок: сравнение схемы страницы с эталоном, мониторинг процента успешных извлечений, автоматические тесты на фикстурах. Типичный показатель: 95%+ успешных извлечений при стабильной работе системы.
Хорошо спроектированная система парсинга — это не разовая разработка, а инфраструктура с жизненным циклом. Закладывайте время на поддержку: примерно 20% от времени первоначальной разработки в год.







