Парсинг данных из GitHub (активность крипто-проектов)
Вы анализируете криптопроекты и хотите отсеять хайп? Количество коммитов, число активных контрибьюторов и частота релизов — объективные метрики разработки. Но GitHub API имеет rate limit, много ботов, а ручной сбор данных по 2000 репозиториям занимает недели. Мы автоматизируем сбор и очистку, предоставляя чистые временные ряды для вашего портфеля.
Почему GitHub-активность — надёжный сигнал?
В отличие от рыночных метрик, developer activity сложно накрутить. Подделка коммитов или истории репозитория требует прямого доступа к аккаунтам — это дорого и легко детектится. Около 80% проектов с высокой developer activity (более 50 коммитов в месяц) показывают устойчивый рост TVL. Наши клиенты используют эти данные для инвестиционного скрининга и мониторинга портфеля. Например, один клиент сэкономил $8000 на разработке собственного пайплайна, заказав готовое решение у нас.
Какие данные о разработке можно собрать через GraphQL?
GitHub предоставляет два API. Для сбора данных о репозиториях лучше подходит GraphQL API v4 — позволяет за один запрос получить данные, на которые REST потратил бы 5–10 запросов.
Официальная документация GitHub утверждает, что GraphQL API v4 предоставляет более эффективный и гибкий способ запроса данных. Источник
query RepoActivity($owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { stargazerCount forkCount defaultBranchRef { target { ... on Commit { history(first: 100) { totalCount nodes { committedDate author { name email } additions deletions } } } } } releases(last: 5) { nodes { tagName createdAt } } issues(states: OPEN) { totalCount } pullRequests(states: MERGED, last: 30) { nodes { createdAt mergedAt } } } } Один запрос — и вы имеете коммиты за 100 последних дней, releases, open issues, merged PRs. Аутентификация: Personal Access Token (PAT) с public_repo scope.
Стандартный набор метрик для dashboard
| Метрика | Endpoint / поле | Частота сбора |
|---|---|---|
| Commit count (30d/90d) | defaultBranchRef.target.history.totalCount |
Ежедневно |
| Active contributors | defaultBranchRef.target.history.nodes[].author |
Ежедневно |
| Code churn (additions + deletions) | history.nodes[].additions/deletions |
Ежедневно |
| Stars / forks | stargazerCount, forkCount |
Ежедневно |
| Issues velocity | Open issues + closed last 30d | Еженедельно |
| PR merge time (median) | pullRequests.mergedAt - createdAt |
Еженедельно |
| Release cadence | Даты последних releases |
Еженедельно |
Contributor deduplication: один разработчик может коммитить с разными email. Нормализация через GitHub login (если коммит ассоциирован с аккаунтом) или fuzzy matching по имени. Боты (Dependabot, renovate, github-actions) нужно исключать из подсчёта человеческих контрибьюторов. В среднем 20% коммитов в популярных репозиториях вносятся ботами, поэтому фильтрация критична.
Как обойти rate limit при сборе 2000+ репозиториев?
Crypto-индекс из 200 проектов — каждый с 5–10 репозиториями — это 1000–2000 репозиториев. При ежедневном сборе и 5000 points/час лимите нужно управлять бюджетом запросов. Стоимость GraphQL запроса = sum(requested_nodes). Сложный запрос с 100 коммитами стоит ~100 points. Для 2000 репозиториев нужно ~200k points — это 40 часов при одном PAT токене.
Пример настройки пула PAT-токенов
import httpx import asyncio from collections import deque class GitHubRateLimiter: def __init__(self, tokens: list[str]): self.tokens = deque(tokens) self.current_remaining = {t: 5000 for t in tokens} async def get_token(self) -> str: # Rotate to token with most remaining points token = max(self.tokens, key=lambda t: self.current_remaining[t]) if self.current_remaining[token] < 100: await asyncio.sleep(3600) # Wait for reset return token async def graphql(self, query: str, variables: dict) -> dict: token = await self.get_token() async with httpx.AsyncClient() as client: resp = await client.post( "https://api.github.com/graphql", json={"query": query, "variables": variables}, headers={"Authorization": f"Bearer {token}"}, ) # Update remaining from response headers cost = resp.json().get("data", {}).get("rateLimit", {}).get("cost", 1) self.current_remaining[token] -= cost return resp.json() Решения:
- Несколько PAT токенов с ротацией. Пул из 10 токенов даёт 50k points/час — достаточно для ежедневного сбора 2000 репозиториев.
-
Incremental collection: не собирать всю историю каждый раз. Хранить
last_collected_at, запрашивать только новые коммиты черезsinceпараметр. - Prioritization: "горячие" репозитории (высокая активность, большой TVL проекта) собираются чаще, "холодные" — раз в неделю.
Маппинг проектов к репозиториям
Составление и поддержание списка project → github_repos — отдельная задача. Источники:
- Electric Capital Developer Report публикует open-source маппинг проектов к репозиториям на GitHub.
- DeFiLlama API имеет поле
githubв данных протоколов:GET https://api.llama.fi/protocolsвозвращает список протоколов с github URL. - Manual curation: для новых проектов или проектов с нестандартными github org именами.
Важный нюанс: крупные проекты (Ethereum, Solana, Uniswap) имеют десятки репозиториев в организации. Суммировать активность по всей org нужно с фильтрацией — repo-зеркала, форки, документационные репозитории искажают метрики.
Хранение и агрегация
TimescaleDB или ClickHouse для time-series метрик. Схема:
CREATE TABLE github_metrics ( project_id INTEGER, repo_full_name TEXT, measured_date DATE, commits_30d INTEGER, contributors_30d INTEGER, additions_30d BIGINT, deletions_30d BIGINT, stars INTEGER, open_issues INTEGER, PRIMARY KEY (repo_full_name, measured_date) ); -- Агрегат по проекту (все его репозитории) CREATE VIEW project_dev_activity AS SELECT project_id, measured_date, SUM(commits_30d) AS total_commits, COUNT(DISTINCT repo_full_name) AS active_repos, SUM(contributors_30d) AS total_contributors FROM github_metrics GROUP BY project_id, measured_date; Нормализованный developer activity score: log(commits + 1) × log(contributors + 1) — логарифмирование сглаживает outliers (один проект с 10k commits не должен доминировать в рейтинге).
Что входит в нашу работу по парсингу GitHub-активности
Мы предлагаем полный цикл сбора и анализа developer activity:
| Этап | Результат |
|---|---|
| Аудит источников | Список проектов с привязкой к репозиториям |
| Настройка пайплайна | Асинхронный сбор через GraphQL с ротацией токенов |
| Фильтрация ботов | Чистые данные по человеческому вкладу |
| Агрегация | Ежедневные метрики в TimescaleDB + дашборд |
| Документация | Описание схемы и методологии |
После сбора вы получаете доступ к сырым данным и визуализациям. Мы также обучаем вашу команду поддерживать пайплайн. Закажите парсинг GitHub-активности для вашего портфеля. Получите консультацию по настройке сбора данных — оценим объём и сроки работ.







