6시간마다 스스로 업데이트되는 비용 0원, API 미사용 GitHub Trending 애그리게이터 구축기
요약
GitHub Trending API의 부재와 비용 문제를 해결하기 위해 Python과 GitHub Actions를 활용하여 비용 0원의 자동 업데이트 애그리게이터를 구축하는 방법을 소개합니다. HTML 파싱과 GitHub Actions의 스케줄러 기능을 결합하여 효율적인 데이터 수집 시스템을 만드는 가이드를 제공합니다.
핵심 포인트
- API 없이 표준 라이브러리만으로 HTML 파싱을 통해 데이터 추출
- GitHub Actions를 무료 cron 서버로 활용하여 자동화 구현
- 데이터 활용도를 높이기 위해 HTML과 JSON 형식을 동시 생성
- 스케줄 드리프트 및 마크업 변경에 대비한 탄력적 설계 권장
매일 아침, 저는 github.com/trending을 열고 5페이지를 스크롤하며 코드 한 줄을 쓰기도 전에 20분을 허비하곤 했습니다. 가장 최악인 점은 공식적인 GitHub Trending API가 없다는 것이었습니다. 모든 서드파티 래퍼(wrapper)는 토큰을 요구하거나, 10번의 요청 후에 속도 제한(rate-limit)을 걸거나, 본질적으로 공개된 HTML 페이지임에도 불구하고 비용을 청구했습니다.
그래서 저만의 애그리게이터(aggregator)를 직접 만들었습니다. 이 시스템은 월 비용이 0달러이며, API 키가 전혀 필요하지 않고, 6시간마다 스스로 업데이트됩니다. 전체 코드는 약 200줄의 Python과 하나의 GitHub Actions 워크플로(workflow)로 구성되어 있습니다. 어떻게 작동하는지 소개하겠습니다.
핵심 비결: JSON이 아닌 HTML 파싱 (parse HTML, not JSON)
GitHub는 Trending 페이지를 서버 사이드 HTML로 렌더링합니다. 이는 몇 가지 정규 표현식(regex)만으로 필요한 모든 것을 추출할 수 있음을 의미합니다. 헤드리스 브라우저(headless browser), API 토큰, 인증이 전혀 필요 없습니다.
import re, json, urllib.request
URL = "https://github.com/trending?since=daily"
...
이것이 스크래퍼(scraper)의 전부입니다. 단 25줄입니다. BeautifulSoup, Selenium, Playwright도 필요 없습니다. GitHub의 Trending 마크업(markup)이 놀라울 정도로 안정적이기 때문에 표준 라이브러리(standard library)만으로도 충분합니다.
자동화: 무료 cron 서버로서의 GitHub Actions
제가 가장 좋아하는 부분입니다. VPS를 임대하거나 Raspberry Pi를 실행하는 대신, GitHub Actions를 무료이며 항상 켜져 있는 cron 스케줄러(scheduler)로 사용합니다.
name: Daily Trending Deploy
on:
schedule:
...
제가 시행착오를 통해 배운 몇 가지 사항은 다음과 같습니다:
- 전용 배포 액션(deploy action)을 사용하세요.
peaceiris/actions-gh-pages는 브랜치 전환과 토큰 권한을 처리해주므로, 워크플로(workflow) 내부에 직접 git-push 관련 저수준 작업(plumbing)을 작성할 필요가 없습니다. - HTML과 함께 JSON 파일을 출력하세요. 저는
index.html과trending.json을 모두 생성합니다. JSON 엔드포인트(endpoint)가 있으면 다른 도구들(대시보드, 봇, 개인 스크립트 등)이 데이터를 다시 스크래핑할 필요 없이 동일한 데이터를 소비할 수 있습니다. - 스케줄 드리프트(Schedule drift)는 실제로 발생합니다.
*/6크론(cron) 설정은 신뢰할 수 있지만 즉각적이지는 않습니다. 데이터의 최신성(freshness)이 중요하다면,workflow_dispatch를 예비 수단으로 추가하고 UI에 수동 "지금 새로고침" 버튼을 만드세요. - 스크래퍼(scraper)를 탄력적으로 유지하세요. fetch 과정을 try/except로 감싸고, GitHub의 마크업(markup)이 변경될 경우를 대비해 _마지막으로 성공한 스냅샷(last good snapshot)_을 보관하세요. 어제의 데이터를 보여주는 애그리게이터(aggregator)는 여전히 유용하지만, 빈 페이지는 아무런 도움이 되지 않습니다.
"API 미사용"이 기능인 이유
대부분의 개발자는 가장 먼저 API를 찾습니다. 하지만 소스가 공개된 HTML 페이지인 경우, 이를 직접 파싱(parsing)하는 것은 실질적인 장점이 있습니다:
- 교체할 토큰도, 협상할 속도 제한(rate limit)도 없음 — 당신은 일반적인 브라우저 요청과 동일합니다.
- 벤더 종속성(vendor lock-in) 없음 — GitHub이 무언가를 변경하더라도, 의존성(dependency) 버전을 수정하는 대신 정규 표현식(regex) 하나만 수정하면 됩니다.
- 어디서든 실행 가능 — 스크립트에 Python 3만 있으면 되므로 노트북, 5달러짜리 VPS, 또는 GitHub Actions 러너(runner) 어디서든 작동합니다.
이 패턴이 확장되는 사례
"스크래핑(scrape) → 변환(transform) → 정해진 일정에 따라 Pages에 게시(publish)" 파이프라인은 일회성 작업이 아닌 하나의 템플릿입니다. 저는 이를 다음과 같은 용도로 재사용해 왔습니다:
- 📰 AI 도구 데일리 다이제스트 (RSS 피드)
- 📈 주식/암호화폐 가격 트렌드 모니터 — 동일한 Actions 크론, 동일한 Pages 호스팅, 다른 소스
- 🎯 Hacker News 인기 뉴스 애그리게이션
- 🛠️ DevOps 툴체인(toolchain) 워치리스트(watchlists)
스스로 업데이트되는 개인용 "테크 레이더(tech radar)" 페이지를 만들고 싶은 개발자라면, 이는 주말 동안 1시간이면 끝낼 수 있는 프로젝트입니다.
직접 시도해 보세요
전체 프로덕션급 버전(반응형 모바일 친화적 사이트, 구조화된 JSON 출력, 그리고 완전한 Actions 워크플로 포함)은 오픈 소스로 공개되어 있습니다:
👉 https://github.com/Felixwang007/github-daily-trending
라이브 데모 (Live demo): https://Felixwang007.github.io/github-daily-trending
이 프로젝트는 MIT 라이선스 (MIT licensed)를 따릅니다. 포크(fork)하여 제 콘텐츠를 모두 제거하고, 여러분이 추적하고 싶은 무엇이든 연결해 사용하세요. 만약 이 프로젝트를 기반으로 멋진 것을 만드신다면, 댓글이나 Pull Request (PR)를 통해 꼭 알려주시면 정말 감사하겠습니다.
또한, A주 (A-shares)를 거래하신다면 저의 다른 오픈 소스 프로젝트인 A-Share Stock Analysis Expert도 확인해 보세요. 기술적 분석 (technical analysis), 기본적 분석 (fundamental analysis), 그리고 심리 분석 (sentiment analysis)을 하나의 도구로 결합한 세 가지 기둥 기반의 주식 스크리닝 (stock screening) 시스템입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기