**Задача:** Разработать парсер для RSS-ленты `https://kapital.kz/rss/` на Spring Boot с сохранением результатов в MongoDB. **Контекст:** Парсер является частью AI-платформы для маркетинговой аналитики. Его цель — собирать деловые новости из источника Kapital.kz, нормализовать их и сохранять в общую базу данных для дальнейшей аналитической обработки. --- ## Основные требования 1. **Получение данных**: Создать сервис, который выполняет HTTP GET-запрос к URL: `https://kapital.kz/rss/`. 2. **Парсинг RSS**: Разобрать полученный XML-ответ. Для каждой записи (элемента ``) в RSS-ленте необходимо извлечь следующие поля: - `title` (заголовок). - `link` (URL статьи). - `pubDate` (дата публикации). - `description` (текстовое содержимое). 3. **Нормализация данных**: - **Очистка текста**: Текстовое содержимое из поля `description` должно быть полностью очищено от HTML-тегов. - **Формат даты**: Дата публикации должна быть приведена к формату `ISODate`. 4. **Создание хэша**: Для каждой новости необходимо сгенерировать уникальный хэш для дедупликации по формуле `sha256(url + "::" + title)`. 5. **Сохранение в MongoDB**: - Подготовленные данные должны сохраняться в ту же коллекцию `market_items`. - Операция сохранения должна быть **"upsert"** (обновить, если существует, или вставить, если нет), используя поле `hash` в качестве уникального ключа. --- ## Модель данных для коллекции `market_items` в MongoDB Структура документа должна полностью соответствовать уже существующей модели. ```json { "source_name": "Kapital.kz (Бизнес)", // Статическое значение для этого парсера "url": "https://kapital.kz/...", // Из поля "title": "Заголовок новости", // Из поля "published_at": ISODate("2025-09-14T..."), // Из поля <pubDate> "added_at": ISODate("..."), // Текущее время при добавлении "raw_text": "Очищенный от HTML текст статьи...", // Из поля <description> "hash": "...", // Сгенерированный SHA-256 хэш "category": "Бизнес", // Можно задать по умолчанию // Блок для будущей аналитики "analytics": { "summary": null, "sentiment": null, "tags": [], "entities": {} } } ``` --- ## Технологический стек и реализация - **Фреймворк**: Spring Boot - **База данных**: Spring Data MongoDB - **Реализация**: Рекомендуется создать новый класс-сервис (например, `KapitalParserService`) по аналогии с существующим `KursivParserService`. - **Планирование**: Новый сервис также должен запускаться по общему расписанию — **каждые 30 минут**. Это можно сделать, добавив аннотацию `@Scheduled(cron = "0 0/30 * * * ?")` на метод парсинга в новом сервисе. --- ## Критерии выполнения - Создан новый Spring Boot сервис (`KapitalParserService`), который успешно парсит данные с `https://kapital.kz/rss/`. - Приложение автоматически запускает оба парсера (Kursiv и Kapital) каждые 30 минут. - Новости из Kapital.kz корректно сохраняются в общую коллекцию `market_items` без создания дубликатов. - Структура сохраненных документов в MongoDB полностью соответствует указанной модели данных.