https://github.com/terratensor/feed-parser
Парсер событий kremlin.ru | mid.ru | mil.ru …
https://github.com/terratensor/feed-parser
Last synced: 3 months ago
JSON representation
Парсер событий kremlin.ru | mid.ru | mil.ru …
- Host: GitHub
- URL: https://github.com/terratensor/feed-parser
- Owner: terratensor
- License: bsd-3-clause
- Created: 2024-03-02T15:53:08.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2025-05-12T12:33:51.000Z (11 months ago)
- Last Synced: 2025-05-12T12:35:43.109Z (11 months ago)
- Language: Go
- Homepage: https://feed.svodd.ru
- Size: 369 KB
- Stars: 2
- Watchers: 2
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# feed-parser
Сервис позволяет периодически в заданный в файле конфигурации промежуток времени, например, 10-15 минут
опрашивать список RSS лент сайтов. Сервис читает ленту, разбирает ее, создает из
элементов ленты объект единого вида Entry, который сохраняет в индексе
ManticoreSearch. Если в RSS ленте нет контента, то сервис идет по ссылке записи, скачивает страницу, разбирает ее и создает объект стандартного вида Entry.
На данный момент реализованы парсеры сайтов mid.ru, kremlin.ru, mil.ru
и их языковые версии.
Существенное отличие от прошлых реализация парсеров — универсальность,
можно подключить rss ленту любого сайта или агентства новостей, например tass.ru.
В инженерном плане применена концепция worker poll — пул воркеров, при старте службы, сервис читает ссылки лент и запускает для каждой ссылки парсер, парсеры работают в параллельном режиме.
```go
urls := []Link{
{Url: "http://kremlin.ru/events/all/feed/", Lang: "ru", ResourceID: 1},
{Url: "http://en.kremlin.ru/events/all/feed", Lang: "en", ResourceID: 1},
{Url: "https://mid.ru/ru/rss.php", Lang: "ru", ResourceID: 2},
{Url: "https://mid.ru/en/rss.php", Lang: "en", ResourceID: 2},
{Url: "https://mid.ru/de/rss.php", Lang: "de", ResourceID: 2},
{Url: "https://mid.ru/fr/rss.php", Lang: "fr", ResourceID: 2},
{Url: "https://mid.ru/es/rss.php", Lang: "es", ResourceID: 2},
{Url: "https://mid.ru/pt/rss.php", Lang: "pt", ResourceID: 2},
{Url: "https://function.mil.ru/rss_feeds/reference_to_general.htm?contenttype=xml", Lang: "ru", ResourceID: 3},
}
```
Парсеры с периодичностью опрашиват свои ссылки-ленты, читают их и создают из записей ленты задачи. Каждая запись-задача отправляется в очередь на обработку, которую осуществляют worker-ы обработчики, они так же работают параллельно. Количество воркеров по-умолчанию 5.
Каждый обработчик берет задачу из очереди, и обрабатывает её. Делает запрос в индекс ManticoreSearch, ищет эту запись, если не находит, то создает новую запись, и при необходимости запускает crawler, который идет за контентом (сайты mil.ru, mid.ru). Обычно в ленте содержится только заголовок и короткое описание, за статьей обработчик отправляется на сайт и парсит страницу.
Если при разборе ленты и запросе в базу ManticoreSearch, запись уже существует, то осуществляется проверка, по полям updated, если поля в ленте и в базе различаются, то обработчик сохраняет обновленную версию события. По наблюдениям такое довольно часто происходит, так как статьи дополняются со временем, такое точно замечено на сайтах kremlin.ru и mid.ru
Когда все задачи обработаны, обработчики ожидают задачи в очереди, работают в фоне в ожидании записей из лент.
Диаграмма процессов

### Реализовано
- парсер rss ленты, для этого надо предать адрес ленты парсеру, поддерживаются языковые ленты kremlin.ru (ru,en), mid.ru (ru, en, de, fr, es, pt). mil.ru (ru)
- разделение длинного контента на фрагменты по 1800 - 3600 символов, для сохранения каждого фрагмента, как отдельной записи в БД для удобства поиска.
- добавление новых записей(фрагментов) из ленты событий в мантикору
- обновление существующих записей(фрагментов) из ленты в мантикору по специальным условиям. Если при обновлении записи, контента стало больше (например, при сценарии _«Продолжение следует»_), то производится добавление новых фрагментов к существующим фрагментам.
- фронтенд для поиска: [feed-svodd-app](https://github.com/terratensor/feed-svodd-app)
### Используемые библиотеки
- [Manticorer Go client. Сlient for Manticore Search.](https://github.com/manticoresoftware/manticoresearch-go)
- [Gofeed: A Robust Feed Parser for Golang](https://github.com/mmcdole/gofeed)
- [Colly Lightning Fast and Elegant Scraping Framework for Gophers](https://github.com/gocolly/colly/tree/master)
- [goquery - a little like that j-thing, only in Go](https://github.com/PuerkitoBio/goquery)
Полный список зависимостей в файле [go.mod](https://github.com/terratensor/feed-parser/blob/a279808983af6ade816521b8d4c2751ac2de45d5/go.mod)
#### Как сделать backup
```
docker exec -it container_id mysqldump -h0 -P9306 feed > feed_backup.sql
```
## Конфигурация
Подробное описание конфигурационного файла проекта можно найти в [документации](config/README.md).