Ми пропонуємо розробку контент-агрегатора під ключ, що включає автоматичний збір матеріалів, парсинг RSS та API, скрапінг сайтів, дедуплікацію контенту, категоризацію статей, ML класифікацію текстів та персоналізацію стрічки новин. Наш збірник контенту знижує ручну роботу на 80%. Вартість проекту починається від $5000, а середня економія клієнтів становить $2000 на місяць.
Типовий проект включає 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 на Wikipedia.
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 на MDN.
Категоризація та теги
Автоматична класифікація статей за темами:
-
Keyword matching: правила «рубль» → «Фінанси»;
-
ML-класифікація: fastText (в 5 разів швидший за BERT) або 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-сервіс.
Для відео — 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 тижнів |
| Кастомний WYSIWYG-редактор з Tiptap та специфічними блоками |
2–4 тижні |
| Медіатека з S3 + трансформації |
1–3 тижні |
| Повна CMS-система з нуля |
4–10 тижнів |
Бюджет розраховується індивідуально після аудиту. Зв'яжіться з нами — оцінимо ваш проєкт за один день.
Що ви отримаєте після завершення
- Робоча CMS з налаштованими правами доступу
- Документація по контент-моделі та API
- Інструкція для редакторів (текст + відео)
- Код, покритий тестами (PHPUnit для Laravel, Jest для JS)
- Підтримка 1 місяць після деплою
Наш досвід
6 років на ринку, 40+ виконаних проєктів. Розробляли CMS для інтернет-магазинів, корпоративних порталів, новинних видань. Використовуємо ліцензійне ПЗ (sentry.io, sonarcloud) — гарантуємо якість коду.
Джерело: внутрішня статистика проєктів за 2018–2024 рр.
Детальніше про WYSIWYG-редактори читайте на Wikipedia.
Залишилися питання?
Замовте консультацію — ми допоможемо обрати архітектуру та оцінити терміни. Отримайте пропозицію протягом 2 робочих днів.