Разработка контент-агрегатора
Контент-агрегатор собирает материалы из нескольких внешних источников (RSS, API, скрапинг), систематизирует, фильтрует дубликаты и публикует единой лентой. Технически это pipeline: парсинг → нормализация → дедупликация → хранение → отображение → персонализация.
Архитектура сбора данных
Источники контента:
- RSS/Atom — стандартный формат для новостей и блогов
- REST API — официальные API платформ (Reddit, Twitter/X, YouTube Data API)
- Web scraping — для сайтов без RSS/API
- Email newsletter — парсинг входящих писем
Компоненты pipeline:
Scheduler (cron every N min)
↓
Fetcher Queue (Bull/BullMQ per source)
↓
Parser (RSS: rss-parser, HTML: Cheerio/Playwright)
↓
Normalizer (унификация полей: title, url, body, published_at, source_id, image_url)
↓
Deduplicator
↓
PostgreSQL storage
↓
Indexer (Elasticsearch/Meilisearch)
Дедупликация
Дубликаты возникают, когда одна новость публикуется несколькими источниками. Методы:
Exact URL match: url уже в базе → пропустить. Работает только для идентичных URL.
Title hash: hash(normalize(title)) — нормализация убирает пунктуацию и лишние пробелы, затем MD5/SHA1. Эффективно, если заголовки идентичны.
SimHash / MinHash: алгоритмы approximate near-duplicate detection. Документы с SimHash-расстоянием < N считаются дубликатами. Реализация: библиотека simhash-py или near-duplicate.
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 алгоритм) —
@mozilla/readability(Node.js) извлекает основной текст страницы, отсекая навигацию и рекламу - Trafilatura (Python) — extraction текста с определением языка
- Playwright — для JavaScript-heavy сайтов, требующих полного рендера
Категоризация и теги
Автоматическая классификация статей по теме:
- Keyword matching — правила: если в заголовке «рубль», «биржа», «ЦБ» → категория «Финансы»
- ML классификация — fastText или simple BERT-based classifier для многолейбловой классификации
Языковая определённость: langdetect (Python) или franc (Node.js) определяют язык материала.
Персонализация ленты
Пользователь выбирает источники и категории. Фильтрация:
- Включённые/отключённые источники
- Включённые/отключённые категории
- Ключевые слова (следить за темой)
- Минус-слова (скрыть нежелательные темы)
Алгоритмическое ранжирование (опционально): контент, похожий на то, что пользователь читал раньше — выше. Collaborative filtering: «пользователи с похожими интересами читали это».
Соблюдение авторских прав
Агрегатор должен:
- Показывать только краткое превью (лид + ссылку на источник), не полный текст
- Уважать
robots.txtпри скрапинге - Соблюдать rate limits источников
- Указывать источник и автора
Модель fair use допускает сниппеты, но не полный перепечаток.
Монетизация
- Подписка на premium-фильтры (больше источников, уведомления)
- Нативная реклама в ленте
- API-доступ к нормализованному контенту
Сроки
MVP (10–20 RSS-источников, лента, базовый поиск, категории): 4–6 недель. Полноценный агрегатор с ML-классификацией, скрапингом, персонализацией и API: 3–5 месяцев.







