Розробка контент-агрегатора
Контент-агрегатор збирає матеріали з кількох зовнішніх джерел (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)
Видалення дублікатів
Дублікати виникають, коли одна новина публікується кількома джерелами. Методи:
Точна відповідність URL: якщо url уже в базі даних → пропустити. Працює тільки для ідентичних URL.
Хеш заголовку: hash(normalize(title)) — нормалізація видаляє пунктуацію та додаткові пробіли, потім MD5/SHA1. Ефективно для ідентичних заголовків.
SimHash / MinHash: алгоритми для приблизного виявлення майже однакових документів. Документи з 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) — видалення тексту з визначенням мови
- Playwright — для сайтів із JavaScript, які потребують повного рендерингу
Категоризація та теги
Автоматична класифікація статей за темою:
- Пошук за ключовими словами — правила: якщо заголовок містить "долар", "фондова біржа", "центральний банк" → категорія "Фінанси"
- ML класифікація — fastText або простий BERT-based класифікатор для мультимітковної класифікації
Визначення мови: langdetect (Python) або franc (Node.js) визначають мову матеріалу.
Персоналізація стрічки
Користувачі вибирають джерела та категорії. Фільтрація:
- Увімкнені/вимкнені джерела
- Увімкнені/вимкнені категорії
- Ключові слова (стежити за темою)
- Мінус-слова (приховати небажані теми)
Алгоритмічне ранжування (опційно): контент, подібний до того, що користувач читав раніше, займає вищу позицію. Collaborative filtering: "користувачі з подібними інтересами читали це".
Дотримання авторських прав
Агрегатори повинні:
- Показувати тільки короткі превʼю (лід + посилання на джерело), не повний текст
- Поважати
robots.txtпри скрепінгу - Дотримуватися rate limits джерел
- Зазначати джерело та автора
Fair use дозволяє фрагменти, але не повний перепечатк.
Монетизація
- Підписка на премієм-фільтри (більше джерел, сповіщення)
- Нативна реклама в стрічці
- API-доступ до нормалізованого контенту
Графік проекту
MVP (10–20 RSS-джерел, стрічка, базовий пошук, категорії): 4–6 тижнів. Повнофункціональний агрегатор з ML-класифікацією, скрепінгом, персоналізацією та API: 3–5 місяців.







