Збір даних CoinGecko і CoinMarketCap: парсинг, API, кешування

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

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

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

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

Без ключа ідемпотентності за зв'язкою «джерело — торговий інструмент — часове вікно» та обмеження паралелізму черга повторів сама стає джерелом навантаження.

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

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

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

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

Що дає вибудуваний збір ринкових даних

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

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

  • Цілісність історії. Кожен інтервал закритий точкою даних; частка пропусків видна у звіті й вимірюється в десятих частках відсотка, а не з'ясовується через місяць.
  • Єдиний контур даних. Котирування, обсяги та капіталізація з обох джерел зведені до спільних міток часу — звірка йде всередині одного набору, без зшивання таблиць вручну.
  • Передбачуване навантаження на джерело. Частота опитування та глибина кешу розраховані так, щоб вкладатися в ліміти й не йти в блокування при пікових рухах ринку.
  • Відмова від ручних вивантажень. Нуль операцій «завантажити й перейменувати»: збір, нормалізація та запис ідуть без участі людини за розкладом.
  • Автоматична звірка джерел. Розходження ціни або обсягу вище порогу йде в журнал з контекстом запиту — аномалія видна до того, як потрапить у розрахунки.

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

Формати збору: парсинг CoinGecko, офіційний API, вебхуки

Вибір джерела визначає, наскільки стійко дані доїдуть до вітрин.

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

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

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

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

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

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

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

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

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

Що передаємо: конфігурації, схеми даних і документація

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

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

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

Кейс: як агрегатор котирувань перестав втрачати історію цін

Де втрачалася історія

Парсинг CoinGecko, CoinMarketCap і ще двох біржових стрічок ішов самописними скриптами за розкладом.

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

За квартал накопичилося близько 6% інтервалів без котирувань і 4% задвоєних свічок, розходження між джерелами не рахував ніхто.

Що змінили

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

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

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

Метрики до і після

Частка пропущених інтервалів упала з 6% до 0,1%, дублі вичищені повністю — неперервна історія цін перевіряється автоматично, від першої свічки інструмента до останньої.

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

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

Чим CoinMarketCap відрізняється від біржового агрегатора

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

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

Критерій Агрегатор ринку Біржовий агрегатор
Джерело ціни Зведення з десятків бірж за вагами Власний стакан
Частота Снапшот раз на 1–5 хвилин Потік, частки секунди
Поля Ціна, обсяг за добу, капіталізація, біржі-джерела Ціна, глибина, стрічка угод
Обмеження Запізнення, фільтр пар, склейка майданчиків Немає своєї пари — немає даних

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

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

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

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

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

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

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

Джерело почало віддавати відмови замість даних — що далі?

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

Чому ціни в двох джерел відрізняються на частки відсотка?

Різні методики розрахунку та різний час знімка. Для рішень важлива не «істинна» ціна, а узгодженість: рахуємо відхилення й фіксуємо його динаміку за кожним інструментом.

Що буде, якщо джерело змінить формат відповіді?

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

Чи можна перерахувати історію за минулий період?

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

Обговоримо задачу: з чого почнемо збір ваших даних

Щоб повернутися з оцінкою робіт, а не з вилкою «як вийде», потрібен мінімум ввідних.

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

  • Джерела — CoinGecko, CoinMarketCap або обидва одразу; чи потрібен резервний канал на випадок помилок і обмежень за кількістю звернень.
  • Перелік активів і пар — тикери, ідентифікатори, торговельні пари та загальна кількість сутностей, які потрібно покрити.
  • Глибина історії — на скільки назад потрібні котирування та метрики, чи є вже вивантажений архів у файлах або базі.
  • Частота оновлення — раз на хвилину, годину чи добу; чи потрібні внутрішньоденні свічки і яка затримка допустима при збої.
  • Доступи — тариф джерела, ключі, ліміти звернень і правила їх зберігання в конфігурації.
  • Приймач даних — реляційна база, колонкове сховище або файли; потрібна точність і одиниці цін.

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

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

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

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