67 lines
4.6 KiB
Markdown
67 lines
4.6 KiB
Markdown
**Задача:** Разработать парсер для RSS-ленты `https://kapital.kz/rss/` на Spring Boot с сохранением результатов в MongoDB.
|
|
|
|
**Контекст:** Парсер является частью AI-платформы для маркетинговой аналитики. Его цель — собирать деловые новости из источника Kapital.kz, нормализовать их и сохранять в общую базу данных для дальнейшей аналитической обработки.
|
|
|
|
---
|
|
|
|
## Основные требования
|
|
|
|
1. **Получение данных**: Создать сервис, который выполняет HTTP GET-запрос к URL: `https://kapital.kz/rss/`.
|
|
2. **Парсинг RSS**: Разобрать полученный XML-ответ. Для каждой записи (элемента `<item>`) в 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/...", // Из поля <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
|
|
- **Реализация**: Рекомендуется создать новый класс-сервис (например, `KapitalParserService`) по аналогии с существующим `KursivParserService`.
|
|
- **Планирование**: Новый сервис также должен запускаться по общему расписанию — **каждые 30 минут**. Это можно сделать, добавив аннотацию `@Scheduled(cron = "0 0/30 * * * ?")` на метод парсинга в новом сервисе.
|
|
|
|
---
|
|
|
|
## Критерии выполнения
|
|
|
|
- Создан новый Spring Boot сервис (`KapitalParserService`), который успешно парсит данные с `https://kapital.kz/rss/`.
|
|
- Приложение автоматически запускает оба парсера (Kursiv и Kapital) каждые 30 минут.
|
|
- Новости из Kapital.kz корректно сохраняются в общую коллекцию `market_items` без создания дубликатов.
|
|
- Структура сохраненных документов в MongoDB полностью соответствует указанной модели данных.
|