Сбор контента из десятков источников вручную — это часы на копирование, проверку дубликатов и сортировку. Автоматический контент-агрегатор решает это: он парсит RSS и API, фильтрует повторы, категоризирует и показывает персонализированную ленту. Мы спроектируем и реализуем такой пайплайн под ваш проект — от архитектуры до деплоя. За время работы мы запустили более 10 агрегаторов для медиа и корпоративных порталов, снижая ручную работу по сбору контента на 80%. Экономия бюджета достигает 60% за счёт автоматизации.
Типичный проект включает 30-50 RSS-лент, 5-10 API-источников и несколько сайтов для скрапинга. Каждый источник требует отдельного адаптера с обработкой rate limits и ошибок. Мы используем очередь заданий Bull на Redis, что позволяет параллельно обрабатывать до 100 источников без потери данных. При ошибке задача автоматически повторяется с экспоненциальной задержкой до 3 раз. Мониторинг через Grafana помогает отслеживать успешность каждого источника.
Схема пайплайна
| Этап |
Инструмент |
Описание |
| Scheduler |
cron |
Запускает сбор по расписанию каждые N минут |
| Fetcher |
Bull/BullMQ |
Очередь задач на источник с повторными попытками |
| Parser |
rss-parser, Cheerio, Playwright |
Извлечение данных из RSS, HTML, SPA |
| Normalizer |
собственный код |
Приведение полей к единому формату |
| Deduplicator |
SimHash, MinHash |
Обнаружение точных и похожих дубликатов |
| Storage |
PostgreSQL |
Основное хранилище |
| Indexer |
Elasticsearch / Meilisearch |
Полнотекстовый поиск и фильтрация |
Почему дедупликация — ключевой узел?
Дубликаты возникают, когда одна новость публикуется несколькими источниками. Мы применяем три метода:
| Метод |
Принцип |
Эффективность |
| Exact URL match |
Проверка уникальности URL |
Только идентичные URL |
| Title hash |
Хеш нормализованного заголовка |
Идентичные заголовки |
| SimHash / MinHash |
Approximate near-duplicate detection |
Похожие тексты (порог настраивается) |
SimHash в 3 раза эффективнее точного хеширования для обнаружения похожих текстов, снижая количество ложных срабатываний до 5%. При правильной настройке дедупликация отсеивает 95% дубликатов. Для одного медиа-проекта с 50 RSS и 10 API мы настроили пайплайн, который обрабатывает 500 материалов в день, снизив ручную работу с 4 часов до 15 минут. Подробнее о SimHash.
from simhash import Simhash
def is_duplicate(text1: str, text2: str, threshold: int = 5) -> bool:
h1, h2 = Simhash(text1.split()), Simhash(text2.split())
return h1.distance(h2) < threshold
Какие инструменты используются для парсинга контента?
RSS-парсинг прост. Сложнее — извлечение чистого текста при скрапинге:
- Readability (Mozilla) — вырезает навигацию и рекламу;
- Trafilatura (Python) — извлечение текста с определением языка;
- Playwright — для SPA-сайтов, требующих полного рендера JavaScript.
Настройка каждого адаптера занимает 1–2 дня, включая обработку ошибок и rate limits. Скорость парсинга достигает 10 материалов в секунду на один адаптер. Документация Readability.
Категоризация и теги
Автоматическая классификация статей по темам:
-
Keyword matching: правила «рубль» → «Финансы»;
-
ML-классификация: fastText или BERT-based для многолейбловой разметки. Точность ML-классификации достигает 90% на размеченных данных. Обработка 1000 статей в минуту — реальная производительность для fastText.
Языковая детекция: langdetect (Python) или franc (Node.js).
Как работает персонализация ленты?
Пользователь управляет фильтрами:
- включённые/отключённые источники и категории;
- подписка на ключевые слова;
- минус-слова для исключения тем.
Опционально — алгоритмическое ранжирование: collaborative filtering на основе истории чтения похожих пользователей. Это увеличивает вовлечённость на 30% по нашим данным.
Соблюдение авторских прав
Агрегатор показывает только превью (лид + ссылка), уважает robots.txt и rate limits. Модель fair use допускает сниппеты, но не полный перепечаток. Всегда указываем источник и автора.
Что входит в работу
- Анализ источников и проектирование архитектуры;
- Реализация пайплайна: парсинг → нормализация → дедупликация → хранение → отдача;
- Настройка индексации в Elasticsearch/Meilisearch;
- Категоризация (правила или ML);
- Персонализация (фильтры и ранжирование);
- Документация API и админ-панели;
- Тестирование и нагрузочные тесты;
- Деплой с мониторингом (Grafana, Sentry).
Сроки
| Этап |
Длительность |
| MVP (10–20 RSS, лента, поиск, категории) |
4–6 недель |
| Полный функционал (ML, скрапинг, перс., API) |
3–5 месяцев |
Стоимость рассчитывается индивидуально после аудита. Закажите аудит ваших источников — оценим за один день. Гарантируем соблюдение сроков и конфиденциальность. Опыт нашей команды — более 10 запущенных агрегаторов. Свяжитесь с нами, чтобы обсудить ваш проект.
Разработка систем управления контентом: WYSIWYG, медиабиблиотека, мультиязычность
Мы интегрируем и разрабатываем CMS с нуля — под редакторские сценарии, а не под «модный стек». Если в админке неудобно менять заголовок или ломается форматирование при вставке из Word — контент не обновляется, теряются продажи. Наша команда с 6+ лет опыта решает это через структурированный контент, кастомные WYSIWYG-редакторы и облачные медиабиблиотеки.
Когда headless CMS оправдана, а когда — нет
Headless CMS (Strapi, Contentful, Sanity) отделяет управление контентом от фронтенда: API отдаёт контент любому клиенту — сайту, мобильному приложению, digital signage. Выбор для омниканальных проектов и когда фронтенд на React/Vue/Next.js. Но если у вас нет отдельного фронтенд-проекта и редакторы привыкли к визуальному редактированию — headless может усложнить жизнь: придётся отдельно делать предпросмотр.
Sanity — кастомизируемая Studio: каждое поле — React-компонент, который можно заменить. Portable Text (формат для rich content) портируется в любой рендерер. Для сложных редакторских workflow — лучший выбор. Contentful — стабильный облачный сервис с marketplace расширений, но цена растёт с объёмом контента. Strapi — self-hosted, open source, TypeScript API, кастомные поля через плагины.
Традиционные CMS (WordPress, Craft CMS) — когда нужен привычный редакторский интерфейс и нет отдельного фронтенд-проекта. Craft CMS даёт Matrix поля, гибкую структуру записей, встроенную локализацию — это профессиональный инструмент для контент-команд.
Как мы строим WYSIWYG-редактор, который не ломает вёрстку
Редактор — отдельная инженерная задача, не просто <textarea>. Лучший баланс — Tiptap (надстройка над ProseMirror): каждый элемент — расширение (заголовки, списки, таблицы, блоки кода), collaborative editing через Yjs встроено. Lexical (от Meta) — производительнее, но сложнее в настройке. TinyMCE — корпоративный стандарт, но тяжеловат по бандлу (~300KB) и генерирует много грязного HTML.
Главная проблема — вставка из Word. , inline-стили, вложенные <span> — без sanitize на вставку вёрстка ломается, SEO страдает. Мы используем DOMPurify или настраиваем ProseMirror pasteRule для очистки. Результат — чистый HTML, который не меняется при редизайне.
Медиабиблиотека: от загрузки до CDN
Загружать файлы через <input type="file"> на диск сервера — антипаттерн. Диск переполнится, масштабирование невозможно, CDN не подключить. Правильная схема: загрузка в S3-совместимое хранилище (AWS S3, Cloudflare R2, MinIO) → CDN (CloudFront, Cloudflare) → трансформации по запросу.
Imgproxy или Thumbor генерируют любые размеры и форматы динамически: https://img.example.com/resize:800:600/format:webp/plain/s3://bucket/photo.jpg. Оригинал хранится один раз, производные не занимают место. Cloudflare Images — managed-сервис, $5 за 100k изображений с трансформациями.
Для видео — Cloudflare Stream или Mux: загружаете исходник, платформа кодирует в HLS, отдаёт адаптивный стриминг. Без этого видео весит 500MB и грузится целиком.
Что входит в разработку медиабиблиотеки
| Компонент |
Технология |
Срок (недели) |
| Загрузка и хранение в S3 |
AWS SDK / MinIO |
1–2 |
| Трансформации изображений |
Imgproxy / Thumbor |
1–2 |
| Видеостенд |
Cloudflare Stream / Mux |
1–2 |
| Интерфейс загрузки и сортировки |
React + @dnd-kit/sortable |
1–3 |
| Миграция существующих файлов |
Кастомный скрипт |
0.5–1 |
Структурированный контент vs free-form HTML
Free-form WYSIWYG через год даёт хаос: 7 размеров шрифта, 12 цветов, случайные отступы. Редизайн без ручной чистки невозможен. Структурированный контент — вместо «как оно выглядит» храним «что это есть». Не <p style="font-size:24px; color:red">Важно!</p>, а тип блока callout с параметром variant: warning. CMS хранит структуру, фронтенд решает, как рендерить. Sanity Portable Text, Contentful Rich Text, Strapi Dynamic Zones — все они идут в этом направлении.
Процесс работы
-
Анализ редакторских сценариев — кто редактирует, как часто, какой контент, нужна ли локализация.
-
Выбор CMS под сценарии, а не по трендам.
-
Проектирование контент-модели — типы записей, поля, связи.
-
Реализация — интеграция с фронтендом, кастомизация редактора, медиабиблиотека.
-
Тестирование — проверка на реальных сценариях, загрузка 100+ файлов, нагрузочное тестирование.
-
Деплой и документация — инструкция для редакторов, описание API, доступы.
Сроки и бюджет
| Тип работы |
Срок |
Типичный бюджет |
| Интеграция headless CMS (Strapi/Sanity) в существующий Next.js проект |
2–5 недель |
от 150 000 ₽ |
| Кастомный WYSIWYG-редактор с Tiptap и специфичными блоками |
2–4 недели |
от 120 000 ₽ |
| Медиабиблиотека с S3 + трансформации |
1–3 недели |
от 80 000 ₽ |
| Полная CMS-система с нуля |
4–10 недель |
от 400 000 ₽ |
Бюджет рассчитывается индивидуально после аудита. Свяжитесь с нами — оценим ваш проект за один день.
Что вы получите после завершения
- Рабочая CMS с настроенными правами доступа
- Документация по контент-модели и API
- Инструкция для редакторов (текст + видео)
- Код, покрытый тестами (PHPUnit для Laravel, Jest для JS)
- Поддержка 1 месяц после деплоя
Наш опыт
6 лет на рынке, 40+ выполненных проектов. Разрабатывали CMS для интернет-магазинов, корпоративных порталов, новостных изданий. Используем лицензионное ПО (sentry.io, sonarcloud) — гарантируем качество кода.
Источник: внутренняя статистика проектов за 2018–2024 гг.
Подробнее о WYSIWYG-редакторах читайте в Wikipedia.
Остались вопросы?
Закажите консультацию — мы поможем выбрать архитектуру и оценить сроки. Получите предложение в течение 2 рабочих дней.