Крипто-ринок реагує на новини швидше, ніж tradfi: від публікації статті про регуляторні дії до руху ціни — іноді секунди. Для трейдингових систем, моніторингу ризиків або sentiment-аналізу потрібен структурований потік новин з мінімальною latency. Ми — блокчейн-інженери з 5+ річним досвідом у production — беремо на себе організацію такого потоку під ключ. За час нашої роботи ми реалізували 7 агрегаторів для фондів і трейдерів, скоротивши середню затримку до 3 секунд.
Чому latency критична?
Затримка в 30 секунд може коштувати тисяч доларів при арбітражі імпульсних стратегій. Один з наших клієнтів втратив близько $500 на одній угоді через застарілі дані — після переходу на наш pipeline latency впала з 40 до 2 секунд. Джерела новин різняться за швидкістю: RSS-фіди CoinDesk оновлюються кожні 5–10 хвилин, CryptoPanic API — в реальному часі, парсинг HTML додає ще 10–30 секунд. Ми проєктуємо pipeline так, щоб новина потрапляла у вашу систему з мінімальною затримкою та гарантованою доставкою.
Які джерела використовувати та як?
Порівняння трьох підходів:
| Метод | Швидкість | Надійність | Складність | Приклади |
|---|---|---|---|---|
| RSS/Atom фіди | Середня | Висока | Низька | CoinDesk, CoinTelegraph, The Block |
| Official API | Висока | Висока | Середня | CryptoPanic, Messari, Santiment |
| HTML парсинг | Низька | Низька | Висока | Blockworks, новини бірж |
RSS/Atom фіди (найнадійніше)
CoinDesk, Cointelegraph, The Block, Decrypt — всі мають RSS. Це офіційний, стабільний канал:
import Parser from "rss-parser" const parser = new Parser({ customFields: { item: [["media:content", "media", { keepArray: false }]], }, }) const feeds: Record<string, string> = { coindesk: "https://www.coindesk.com/arc/outboundfeeds/rss/", cointelegraph: "https://cointelegraph.com/rss", theblock: "https://www.theblock.co/rss.xml", decrypt: "https://decrypt.co/feed", } async function fetchFeed(source: string, url: string): Promise<NewsItem[]> { const feed = await parser.parseURL(url) return feed.items.map((item) => ({ source, title: item.title ?? "", url: item.link ?? "", publishedAt: new Date(item.pubDate ?? ""), summary: item.contentSnippet ?? "", guid: item.guid ?? item.link ?? "", })) } Polling кожні 5 хвилин — розумний баланс між freshness та навантаженням на джерело. Дедуплікація за guid.
Official APIs
CryptoPanic API — агрегатор новин з sentiment scoring:
GET https://cryptopanic.com/api/v1/posts/?auth_token={key}¤cies=BTC,ETH&kind=news Віддає структуровані дані з bullish/bearish голосами спільноти. Messari API — якісні новини з asset-тегами:
GET https://data.messari.io/api/v1/news?page=1&limit=50 Santiment — новини + on-chain дані + social metrics в одному API.
HTML парсинг (коли API немає)
Для джерел без RSS — cheerio (Node.js) або BeautifulSoup (Python). Крихкий підхід: будь-яка зміна розмітки ламає парсер. Для критичних джерел — моніторинг успішності парсингу та швидкий alert при падінні extraction rate нижче 95%.
import * as cheerio from "cheerio" async function scrapeBlockworks(html: string): Promise<NewsItem[]> { const $ = cheerio.load(html) return $("article.post-card").map((_, el) => ({ title: $(el).find("h2.post-title").text().trim(), url: $(el).find("a").attr("href") ?? "", publishedAt: new Date($(el).find("time").attr("datetime") ?? ""), summary: $(el).find("p.excerpt").text().trim(), })).get() } Як дедуплікувати новини ефективно?
Дедуплікація критична — одна новина може з'явитися в кількох джерелах. Ми використовуємо дворівневий підхід: спочатку точний збіг за external_id (GUID від RSS), потім fuzzy match за заголовком (косинусна близькість з порогом 0.85). Це відсікає 99% дублів. Для зберігання використовуємо PostgreSQL:
CREATE TABLE news_items ( id BIGSERIAL PRIMARY KEY, source VARCHAR(50) NOT NULL, external_id VARCHAR(255) NOT NULL, title TEXT NOT NULL, url TEXT NOT NULL, published_at TIMESTAMPTZ NOT NULL, summary TEXT, raw_content TEXT, tags TEXT[], UNIQUE (source, external_id) ); CREATE INDEX idx_news_published ON news_items (published_at DESC); CREATE INDEX idx_news_tags ON news_items USING GIN (tags); Asset tagging — визначаємо, які криптоактиви згадані в новині за списком тікерів та назв. Простий regex-based підхід дає 80–90% точності для основних активів. Для складних випадків використовуємо NLP-модель з точністю 95%.
Що важливо в production
Моніторинг freshness: якщо остання новина від джерела старша за 30 хвилин — алерт. RSS може зависнути без явної помилки. Extraction rate — відсоток успішно розпарсених елементів: зниження нижче 90% — критичний алерт. Robots.txt та rate limiting: поважати правила джерела, не генерувати надмірне навантаження. Jitter між запитами (не рівні інтервали). User-Agent: ідентифікувати себе коректно. Деякі джерела блокують headless browser user-agents.
Як налаштувати парсинг новин: покроковий план
- Аналіз джерел та вибір відповідних методів (RSS, API, HTML).
- Проєктування схеми даних та pipeline.
- Реалізація модулів з unit-тестами.
- Налаштування дедуплікації та asset tagging.
- Розгортання в Docker/Kubernetes з моніторингом.
- Документація та інтеграція з клієнтською системою.
Порівняння інструментів для sentiment-аналізу
| Інструмент | Тип | Точність | Швидкість |
|---|---|---|---|
| CryptoPanic голосування | community-based | 70–80% | реальний час |
| Santiment social trends | on-chain + social | 85–90% | 5-10 хв |
| Vader / TextBlob | lexicon-based | 75–85% | мілісекунди |
| FinBERT | NLP-модель | 90–95% | секунди |
Що входить в роботу
- Проєктування архітектури збору даних (схема даних, вибір джерел, балансування навантаження)
- Реалізація модулів парсингу (RSS, API, HTML) з unit-тестами та інтеграційними тестами
- Налаштування дедуплікації та asset tagging
- Розгортання в Docker/Kubernetes з моніторингом та алертингом
- Документація API доступу до даних та інструкція з додавання нових джерел
- Гарантія підтримки після запуску: лагодимо парсер при зміні розмітки протягом 24 годин
Реалістичний термін для агрегатора 10–15 джерел з API + зберіганням: 2–3 тижні. Отримайте консультацію — оцінимо ваш проєкт безкоштовно. Замовте оцінку — ми підберемо оптимальну архітектуру під ваш бюджет та вимоги.







