Парсинг крипто-новин: агрегатор даних з RSS і API

Новинний потік із десятків джерел легко втрачає публікації та дублюється, а ручний збір з'їдає години команди. Ми розробляємо агрегатори крипто-новин під ключ: підключаємо джерела, нормалізуємо дані та віддаємо єдиний потік. На виході — стрічка, де публікація з'являється протягом хвилин, без пропусків і дублів.
Часті запитання

Чому парсинг крипто-новин ламається на десятках джерел

Одиночний скрипт, який раз на хвилину забирає заголовки з одного джерела, працює роками. На тридцяти джерелах збір даних із джерел розсипається: частина стрічок віддає RSS і Atom, частина — лише JSON через закритий інтерфейс, частина — готову розмітку без явних дат.

Джерело змінює структуру відповіді — парсер мовчки віддає порожню видачу, і це помічають не через помилку в журналі, а через актив, що зник зі стрічки.

Далі розходяться час та ідентифікатори. Позначки надходять у різних часових поясах і форматах, ідентифікатори унікальні лише всередині джерела, а перепублікація надходить з іншою адресою та трохи зміненим заголовком.

Без нормалізації часу й зіставлення за нечітким збігом тексту агрегатор крипто-новин показує один матеріал тричі й водночас втрачає першоджерело.

Основна ціна помилки — пропуски публікацій.

У моменти високої волатильності частота публікацій зростає в рази, а обмеження на частоту запитів залишаються незмінними: джерело відповідає відмовою, черга опитування зростає, і вікно між публікацією та потраплянням у стрічку крипто-новин розтягується із секунд до хвилин. Саме в ці хвилини новина й має вагу.

Є й тихий збій: джерело віддає лише останні записи, і при сплеску понад сотню публікацій старі витісняються раніше, ніж їх устигли забрати. Нижче розбираємо, як будується парсинг крипто-новин, щоб стрічка не рвалася на піках.

Що дає єдиний потік даних: швидкість, повнота, відмовостійкість

Єдиний потік даних — це не один парсер, а шар приймання, куди незалежно сходяться RSS-стрічки, публічні API бірж і медіа на кшталт CoinDesk.

Кожна публікація отримує нормалізоване подання: джерело, мітка часу, посилання й відбиток вмісту, за яким знімаються дублі — та сама новина, що надійшла з трьох місць, потрапляє у стрічку один раз.

Затримка появи новини складається з частоти опитування та часу обробки.

Джерела з щільним потоком публікацій опитуються з пріоритетом, рідкісні — рідше, щоб не витрачати квоти API; у результаті новина опиняється у стрічці через десятки секунд після виходу, а не через години очікування ручного вичитування.

Повнота охоплення джерел тримається не на кількості підключених стрічок, а на контролі пропусків.

Частка пропущених публікацій вимірюється звіркою архіву джерела з тим, що дійшло до стрічки: розбіжності йдуть у дозбір, а типові причини — зміна схеми відповіді, редирект, нестандартний формат дати — закриваються окремими правилами розбору й оповіщенням при падінні частки успішних розборів.

Відмовостійкість стрічки будується на ізоляції: кожне джерело — окремий обробник зі своїм станом, повторами та зростаючою паузою між спробами.

При відмові одного джерела інші продовжують наповнювати потік, а після відновлення сервіс дозбирає пропущене вікно за міткою часу — видимого простою стрічки не виникає, втрата обмежується одним інтервалом опитування.

Порівняння способів збору: прямі підключення, готові стрічки, розбір сторінок

Способи збору даних різняться не якістю, а тим, які обмеження джерела ви готові прийняти. Пряме підключення до джерела віддає повний потік з мінімальною затримкою, але потребує ключів, квот і власної обробки лімітів по кожному вузлу.

Готові стрічки новин дають нормалізований потік одразу — ціною чужої частоти опитування та складу полів.

Розбір сторінок видань закриває джерела без програмного доступу, але він найкрихкіший: зміна верстки ламає вибірку, а захист від автоматичних запитів обмежує частоту звернень.

На практиці агрегатор поєднує режими: стрічками закривають широке коло видань, прямими підключеннями — ключові, розбором — решту.

Варіант Коли підходить Обмеження
Пряме підключення до джерела Потрібен повний потік, власні фільтри та низька затримка Ключі доступу, квоти, ліміти запитів, свій формат відповіді в кожного джерела
Готові стрічки новин Потрібне швидке охоплення широкого кола видань Залежність від чужої нормалізації, затримка у видачі, обрізані поля, зміна умов постачальником
Розбір сторінок видань Матеріал є на сайті, але без програмного доступу Крихкість до зміни верстки, захист від автоматичних запитів, нижча швидкість оновлення

Вибір режиму фіксується за кожним джерелом окремо й переглядається, коли постачальник змінює умови або верстку.

Етапи впровадження парсингу: від аудиту джерел до передачі

Порядок робіт вибудувано так, щоб кожен наступний крок спирався на перевірений попередній: спочатку фіксуємо, які джерела взагалі дають придатні дані, і лише потім будуємо навколо них потік.

На виході виходить не набір разових скриптів, а підтримуваний сервіс із передбачуваними точками відмови та зрозумілою вартістю доопрацювань.

  1. Аудит джерел. Інвентаризуємо стрічки та точки доступу: повнота видачі, частота публікацій, обмеження на кількість звернень, правила використання. Окремо позначаємо джерела-дублікати й ті, що віддають лише заголовки.
  2. Схема потоків даних. Узгоджуємо маршрут запису: забір, нормалізація, дедуплікація, збагачення, зберігання, видача споживачам. Фіксуємо набір полів, правила зіставлення монет і поведінку системи при відмові будь-якого вузла.
  3. Налаштування збору. Розклад обходу з урахуванням часових поясів і піків публікацій, повторні спроби з наростаючою затримкою, збереження позиції читання — перезапуск не втрачає й не дублює записи.
  4. Очищення та збагачення. Приводимо тексти до єдиного вигляду, вирізаємо розмітку й рекламні вставки, зіставляємо проєкти за довідником синонімів, проставляємо тему й тональність.
  5. Перевірка на живому потоці. Кілька діб на реальних джерелах: рахуємо частку дублів, затримку появи новини, пропуски, поведінку при недоступності стрічки. Вибірку звіряємо з ручним переглядом.
  6. Моніторинг. Оповіщення про падіння частки успішних заборів і зростання дублів; при відмові одного джерела потік продовжує працювати на інших.
  7. Передача проєкту. Віддаємо схему потоків, конфігурацію джерел, інструкцію з підключення нової стрічки, дашборди й розбір типових збоїв — плюс навчання команди, яка далі веде сервіс самостійно.

Артефакти проєкту: схеми потоків, правила нормалізації, регламенти

Після здачі в команди замовника залишається комплект, за яким систему можна розвивати без нас: він відповідає на три питання — звідки надходять дані, як приводяться до єдиного вигляду і що робити, коли джерело перестало віддавати стрічку. Нижче — базовий набір, який ми передаємо в кожному проєкті.

  • Схема потоків даних — джерела RSS і API, черга, шари нормалізації та зберігання, точки видачі; з позначками, де стоять запобіжники при недоступності фіду.
  • Конфігурації джерел — списки стрічок і ендпоінтів, частота опитування, ліміти запитів, таймаути, повторні спроби з наростаючою паузою.
  • Правила нормалізації — мапінг полів різних стрічок у єдину модель, приведення часу до UTC, канонізація тикерів і категорій, поведінка при частково заповнених записах.
  • Правила дедуплікації новин — порівняння за канонізованою адресою та відбитком заголовка, вікно звірки, поріг схожості тексту, порядок розв'язання конфліктів між джерелами.
  • Регламент експлуатації — як вимкнути шумний фід, підключити новий, переграти пачку записів після збою, кого оповіщати при відставанні потоку.
  • Спостережуваність — дашборд за свіжістю даних, часткою відкинутих дублів і помилками розбору, алерти на мовчання джерела довше заданого інтервалу.
  • Інструкції та тести — порядок локального запуску, збережені відповіді стрічок, перевірки на биту розмітку та зміну формату, щоб правка одного парсера не ламала сусідні.

Кейс: як стрічка агрегатора перестала втрачати публікації

Замовник — редакція галузевого медіа КриптоВестник: стрічка збиралася з кількох десятків джерел, частина віддавала дані потоком, частина — через публічні інтерфейси бірж і аналітичних сервісів.

Опитування за розкладом не було: джерела підключалися хаотично, а стрічка жила завдяки ручному доопрацюванню редактора.

Що було до

На замірі потоку за два тижні до стрічки не доїжджало 8–14% публікацій: дублі витісняли свіжі записи, а збій одного джерела тихо залишав затор у спільній черзі.

Затримка від публікації до появи у стрічці трималася в межах 20–40 хвилин, у дні різких рухів ринку розтягувалася до години. Збирач падав 3–4 рази на тиждень — розрив з'єднання він не переживав і продовжував віддавати порожні відповіді, поки оператор не помічав зникнення.

Що стало після

Переписали збір: єдина черга з підтвердженням обробки, ключ унікальності за заголовком і часом публікації, окремий буфер для повторного розбору збійних відповідей і контроль відставання за кожним джерелом. Втрати впали нижче 0,5% — це шум від видалених на боці джерела матеріалів.

Медіанна затримка стрічки — 40–90 секунд, включно з розбором і перевіркою на дублі. За квартал спостереження простоїв немає: розрив зв'язку призводить до повторної постановки завдань, а не до зупинки стрічки, відновлення займає хвилини.

Редакція перестала дописувати стрічку вручну й повернулася до роботи з текстами: пропуски видно в моніторингу за кожним джерелом, а не за скаргою читача.

Чим відрізняється збір за RSS від роботи з біржовим API?

Це різні класи джерел, і плутати їх — типова помилка при проєктуванні агрегатора. Стрічка віддає вже написані матеріали, біржовий інтерфейс — первинні ринкові дані: угоди, котирування, обсяги за інтервал. Вибір між ними визначає затримку даних і те, що взагалі потрапить у сховище.

Збір за RSS закриває текстовий потік одним модулем: формат Atom та його попередник читаються однаково, сотні видань підключаються правкою списку адрес, без ключів і угод.

Обмеження — вікно видачі: стрічка віддає 10-50 останніх матеріалів і не зберігає архів, тому глибина історії публікацій починається з моменту запуску збору.

Затримка даних — від кількох хвилин до пів години, у частини видань більше, а розмітку кожного джерела доводиться розбирати окремо.

Варіант Коли підходить Обмеження
Збір за RSS Новинний потік, огляди й аналітика від десятків видань Вікно 10-50 матеріалів, затримка до пів години, своя розмітка в кожного джерела
Робота з біржовим API Котирування, угоди, обсяги, події лістингу та делістингу Публікацій немає взагалі, ліміти запитів, потрібен ключ і посторінкова видача

Біржовий інтерфейс дає те, чого немає у стрічках: точний час події та цифри, за якими будуються метрики й сигнали. Натомість — квоти на запити, обмежена глибина за історичними свічками та залежність від доступності конкретного майданчика.

Порівняння джерел даних майже завжди закінчується гібридною схемою: ринкові показники йдуть напряму, тексти — через стрічки, а повний текст документа додається зі сторінки видавця.

Технічні питання: ліміти, дублікати, затримки, відмови джерел

Агрегатор ламається не на розборі однієї стрічки, а на крайових ситуаціях: джерело закриває доступ при частих запитах, та сама новина надходить кількома каналами, публікація з'являється пізніше за першоджерело. Нижче — як влаштована поведінка системи в цих сценаріях.

Джерело обмежує частоту запитів — що тоді?

Опитуємо не за жорстким розкладом, а через накопичувальну чергу з пріоритетом: частота оновлення джерела визначає черговість, а ознака «повтори пізніше» з відповіді зсуває наступний запит. При стійкій відмові канал переводиться на резервний шлях отримання — розсилку або дзеркало стрічки.

Як відрізнити дублікат від повторної публікації?

Порівнюємо за трьома ознаками: канонічне посилання, нормалізований заголовок і відбиток тіла тексту. Збіг за посиланням і відбитком — дублікат: склеюємо в одну картку й зберігаємо перелік джерел.

Збіг лише за заголовком при правках у тілі — розвиток новини, оновлюємо запис, а не створюємо другий.

Новина надійшла із затримкою — як не видати застаріле?

Зберігаємо два часи: момент виходу в джерела й момент виявлення в нас. Стрічка сортується за першим, а розбіжність показує, наскільки канал запізнюється — той, що систематично відстає, знижується в черговості опитування. Матеріали, старші за задане вікно, йдуть в архів і не потрапляють у видачу.

Джерело змінило формат стрічки або недоступне?

Кожна відповідь проходить перевірку за очікуваною схемою: якщо поля зникли або перейменовані, канал іде в карантин і не пише сміття в базу, інженер отримує оповіщення й править схему розбору. На час правки агрегатор працює на інших каналах — потік деградує, але не зупиняється.

Обговоримо задачу: що потрібно для оцінки вашого агрегатора

Оцінка проєкту агрегатора спирається на ввідні, а не на здогадки. Чим точніше описано потік матеріалів і вимоги до результату, тим менше припущень потрапить у план робіт зі збору даних — і тим швидше ми повернемося з розрахунком.

  • Перелік джерел: відкриті стрічки, програмні інтерфейси бірж і медіа, сторінки без офіційного доступу. За кожним важливо розуміти, чи віддає джерело дані штатно чи потрібен розбір розмітки.
  • Обсяг і частота: скільки матеріалів надходить за добу і як швидко вони мають з'являтися в базі. Від цього залежить розклад опитування та запас за навантаженням.
  • Схема нормалізації: які поля потрібні на виході — заголовок, джерело, час публікації, тикери, тональність — і в якому вигляді агрегатор віддає їх споживачу.
  • Правила дедуплікації: як зводити один і той самий сюжет з десятка джерел і яке з них вважати першоджерелом.
  • Зберігання та історія: глибина архіву, чи потрібні знімки минулих версій тексту, вимоги до пошуку за накопиченими даними.
  • Доступи й обмеження: ключі, ліміти запитів, умови використання джерел, обов'язкове маркування даних.
  • Підтримка після запуску: хто стежить за обривом стрічок, як швидко потрібна реакція і що вважаємо деградацією.

Опишіть задачу — повернемося з оцінкою та планом, де окремо проговоримо етапи, ризики й супровід після запуску.

Напрямки блокчейн-розробки

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1543
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1374
  • Розробка логотипу компанії B2B Advance
    Розробка логотипу компанії B2B Advance
    816
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1142