### Техническое задание для AI-агента **Задача:** Разработать парсер (парсер) для RSS-ленты `https://kursiv.media/feed/` на Spring Boot с сохранением результатов в MongoDB. [cite\_start]**Контекст:** Этот парсер является частью большой AI-платформы для маркетинговой аналитики[cite: 5]. Его цель — собирать новости из указанного источника, нормализовать их и сохранять в базу данных для дальнейшей обработки. --- ## Основные требования 1. **Получение данных**: Создать сервис, который выполняет HTTP GET-запрос к URL: `https://kursiv.media/feed/`. 2. **Парсинг RSS**: Разобрать полученный XML-ответ. Для каждой записи (элемента ``) в RSS-ленте необходимо извлечь следующие поля: - [cite\_start]`title` (заголовок)[cite: 64]. - [cite\_start]`link` или `guid` (URL статьи)[cite: 64]. - [cite\_start]`pubDate` или `isoDate` (дата публикации)[cite: 64]. - [cite\_start]`description` или `content` (текстовое содержимое)[cite: 65]. 3. **Нормализация данных**: - [cite\_start]**Очистка текста**: Текстовое содержимое из `description`/`content` должно быть полностью очищено от HTML-тегов[cite: 65]. - **Формат даты**: Дата публикации должна быть приведена к формату `ISODate`. 4. **Создание хэша**: Для каждой новости необходимо сгенерировать уникальный хэш для дедупликации. [cite\_start]Хэш формируется по формуле `sha256(url + "::" + title)`[cite: 54]. 5. **Сохранение в MongoDB**: - Подготовленные данные должны сохраняться в коллекцию MongoDB с названием `market_items`. - [cite\_start]Операция сохранения должна быть **"upsert"** (обновить, если существует, или вставить, если нет)[cite: 56]. [cite\_start]В качестве ключа для поиска существующей записи используйте поле `hash`[cite: 56]. --- ## Модель данных для коллекции `market_items` в MongoDB Документ в коллекции должен иметь следующую структуру: ```json { "source_name": "Kursiv (Бизнес/экономика)", // Статическое значение для этого парсера "url": "https://kursiv.media/article/...", // Из поля "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 - **HTTP-клиент**: `RestTemplate` или `WebClient` - **Парсинг XML/RSS**: Рекомендуется использовать библиотеку, например, **Rome** (`com.rometools:rome`), для удобной работы с RSS-лентами. - **Логика**: Реализовать класс-сервис (например, `KursivParserService`), который будет содержать всю логику. Для взаимодействия с MongoDB использовать `MongoRepository` или `MongoTemplate`. ## Критерии выполнения - Создан Spring Boot сервис, который успешно получает и парсит данные с `https://kursiv.media/feed/`. - При вызове метода этого сервиса, новые записи появляются в коллекции `market_items` в MongoDB. - При повторном вызове дубликаты новостей не создаются, а существующие записи могут быть обновлены (логика `upsert`). - Структура сохраненных документов в MongoDB полностью соответствует указанной модели данных.