{"id":36440059,"url":"https://github.com/terratensor/feed-parser","last_synced_at":"2026-01-11T21:04:31.599Z","repository":{"id":225547489,"uuid":"766198026","full_name":"terratensor/feed-parser","owner":"terratensor","description":"Парсер событий kremlin.ru | mid.ru | mil.ru …","archived":false,"fork":false,"pushed_at":"2025-05-12T12:33:51.000Z","size":378,"stargazers_count":2,"open_issues_count":3,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-05-12T12:35:43.109Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://feed.svodd.ru","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/terratensor.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-03-02T15:53:08.000Z","updated_at":"2025-05-12T12:33:49.000Z","dependencies_parsed_at":"2024-03-25T13:57:12.596Z","dependency_job_id":"2d8eb741-e2c9-43de-b816-c14db9066065","html_url":"https://github.com/terratensor/feed-parser","commit_stats":null,"previous_names":["terratensor/feed-parser"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/terratensor/feed-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terratensor%2Ffeed-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terratensor%2Ffeed-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terratensor%2Ffeed-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terratensor%2Ffeed-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/terratensor","download_url":"https://codeload.github.com/terratensor/feed-parser/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/terratensor%2Ffeed-parser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28323601,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-11T18:42:50.174Z","status":"ssl_error","status_checked_at":"2026-01-11T18:39:13.842Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-11T21:04:30.922Z","updated_at":"2026-01-11T21:04:31.591Z","avatar_url":"https://github.com/terratensor.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# feed-parser\n\nСервис позволяет периодически в заданный в файле конфигурации промежуток времени, например, 10-15 минут \nопрашивать список RSS лент сайтов. Сервис читает ленту, разбирает ее, создает из\nэлементов ленты объект единого вида Entry, который сохраняет в индексе\nManticoreSearch. Если в RSS ленте нет контента, то сервис идет по ссылке записи, скачивает страницу, разбирает ее и создает объект стандартного вида Entry. \nНа данный момент реализованы парсеры сайтов mid.ru, kremlin.ru, mil.ru \nи их языковые версии.\n\nСущественное отличие от прошлых реализация парсеров — универсальность, \nможно подключить rss ленту любого сайта или агентства новостей, например tass.ru.\nВ инженерном плане применена концепция worker poll — пул воркеров, при старте службы, сервис читает ссылки лент и запускает для каждой ссылки парсер, парсеры работают в параллельном режиме. \n\n```go\nurls := []Link{\n    {Url: \"http://kremlin.ru/events/all/feed/\", Lang: \"ru\", ResourceID: 1},\n    {Url: \"http://en.kremlin.ru/events/all/feed\", Lang: \"en\", ResourceID: 1},\n    {Url: \"https://mid.ru/ru/rss.php\", Lang: \"ru\", ResourceID: 2},\n    {Url: \"https://mid.ru/en/rss.php\", Lang: \"en\", ResourceID: 2},\n    {Url: \"https://mid.ru/de/rss.php\", Lang: \"de\", ResourceID: 2},\n    {Url: \"https://mid.ru/fr/rss.php\", Lang: \"fr\", ResourceID: 2},\n    {Url: \"https://mid.ru/es/rss.php\", Lang: \"es\", ResourceID: 2},\n    {Url: \"https://mid.ru/pt/rss.php\", Lang: \"pt\", ResourceID: 2},\n    {Url: \"https://function.mil.ru/rss_feeds/reference_to_general.htm?contenttype=xml\", Lang: \"ru\", ResourceID: 3},\n}\n```\n\nПарсеры с периодичностью опрашиват свои ссылки-ленты, читают их и создают из записей ленты задачи. Каждая запись-задача отправляется в очередь на обработку, которую осуществляют worker-ы обработчики, они так же работают параллельно. Количество воркеров по-умолчанию 5.\n\nКаждый обработчик берет задачу из очереди, и обрабатывает её. Делает запрос в индекс ManticoreSearch, ищет эту запись, если не находит, то создает новую запись, и при необходимости запускает crawler, который идет за контентом (сайты mil.ru, mid.ru). Обычно в ленте содержится только заголовок и короткое описание, за статьей обработчик отправляется на сайт и парсит страницу. \n\nЕсли при разборе ленты и запросе в базу ManticoreSearch, запись уже существует, то осуществляется проверка, по полям updated, если поля в ленте и в базе различаются, то обработчик сохраняет обновленную версию события. По наблюдениям такое довольно часто происходит, так как статьи дополняются со временем, такое точно замечено на сайтах kremlin.ru и mid.ru\n\nКогда все задачи обработаны, обработчики ожидают задачи в очереди, работают в фоне в ожидании записей из лент.\n\n\u003cdetails\u003e\u003csummary\u003eДиаграмма процессов\u003c/summary\u003e\n\u003cp\u003e\n\n![diagram drawio](https://github.com/terratensor/kremlin-parser/assets/10896447/75e21cac-10a4-4820-a8c1-56acf0745b99)\n\n\u003c/p\u003e\n\u003c/details\u003e \n\n### Реализовано\n\n- парсер rss ленты, для этого надо предать адрес ленты парсеру, поддерживаются языковые ленты kremlin.ru (ru,en), mid.ru (ru, en, de, fr, es, pt). mil.ru (ru)\n- разделение длинного контента на фрагменты по 1800 - 3600 символов, для сохранения каждого фрагмента, как отдельной записи в БД для удобства поиска.\n- добавление новых записей(фрагментов) из ленты событий в мантикору\n- обновление существующих записей(фрагментов) из ленты в мантикору по специальным условиям. Если при обновлении записи, контента стало больше (например, при сценарии _«Продолжение следует»_), то производится добавление новых фрагментов к существующим фрагментам.\n- фронтенд для поиска: [feed-svodd-app](https://github.com/terratensor/feed-svodd-app)\n\n\n### Используемые библиотеки\n\n- [Manticorer Go client. Сlient for Manticore Search.](https://github.com/manticoresoftware/manticoresearch-go)\n- [Gofeed: A Robust Feed Parser for Golang](https://github.com/mmcdole/gofeed)\n- [Colly Lightning Fast and Elegant Scraping Framework for Gophers](https://github.com/gocolly/colly/tree/master)\n- [goquery - a little like that j-thing, only in Go](https://github.com/PuerkitoBio/goquery)\n\nПолный список зависимостей в файле [go.mod](https://github.com/terratensor/feed-parser/blob/a279808983af6ade816521b8d4c2751ac2de45d5/go.mod)\n\n\n#### Как сделать backup\n```\ndocker exec -it container_id mysqldump -h0 -P9306 feed \u003e feed_backup.sql\n```\n\n## Конфигурация\nПодробное описание конфигурационного файла проекта можно найти в [документации](config/README.md).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fterratensor%2Ffeed-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fterratensor%2Ffeed-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fterratensor%2Ffeed-parser/lists"}