68 lines
5.1 KiB
Markdown
68 lines
5.1 KiB
Markdown
### Техническое задание для 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-ответ. Для каждой записи (элемента `<item>`) в 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/...", // Из поля <link>
|
||
"title": "Заголовок новости", // Из поля <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 полностью соответствует указанной модели данных.
|