Парсинг даних з крипто-новинних агрегаторів
Крипто-ринок реагує на новини швидше, ніж tradfi: від публікації статті про регуляторні дії до руху ціни — іноді секунди. Для трейдинговых систем, моніторингу рисків або sentiment-аналізу потрібен структурований потік новин з мінімальною latency.
Джерела й методи отримання даних
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.
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();
}
Обробка й зберігання
Дедупліцккація критична — одна новина може появитися в кількох джерелах. Нормалізований URL (видалення UTM параметрів) + title similarity (cosine similarity або Levenshtein distance) для обнаруження дублів.
CREATE TABLE news_items (
id BIGSERIAL PRIMARY KEY,
source VARCHAR(50) NOT NULL,
external_id VARCHAR(255) NOT NULL, -- guid від RSS
title TEXT NOT NULL,
url TEXT NOT NULL,
published_at TIMESTAMPTZ NOT NULL,
summary TEXT,
raw_content TEXT,
tags TEXT[], -- ['bitcoin', 'regulation', 'SEC']
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% точності для основних активів.
Що важливо у production
Robots.txt й rate limiting: дотримуємось правил джерела, не генеруємо надмірну нагрузку. Jitter між запитами (не рівномірні інтервали, це виглядає як бот).
User-Agent: ідентифіцюємось коректно. Деякі джерела блокують headless browser user-agents.
Моніторинг freshness: якщо остання новина від джерела старіша за 30 хвилин — alert. RSS може зависнути без явної помилки.
Реалістичний срок для агрегатора 10–15 джерел з API + зберіганням: 2–3 тижні.







