구현·시험 수집

GitHub 성장 추적과 AI 동향 조사용 수집 파이프라인

공개 저장소의 관측 원본과 수집 범위를 남기고, 같은 기준일의 별 수 변화를 비교하는 도구를 구현했습니다. AI 동향 조사도 출처·실패 상태와 함께 정리합니다.

기간2026
대상공개 GitHub 저장소·AI 동향 소스
역할단독 설계·구현·시험 수집
PythonGitHub REST APIDuckDBParquetHTTP ETag

작업 요약

불변 원본·커버리지 기록 · 기준일별 Parquet·DuckDB 조회 · 구현·시험 수집, 정기 실행 전

인기 목록만으로는 변화를 비교하기 어려웠습니다

GitHub에서 지금 별이 많은 저장소를 보는 것과 최근 관심이 늘어난 저장소를 찾는 일은 다릅니다. 조회 시점과 수집 대상이 달라지면 순위 차이가 실제 성장인지 수집 누락인지 판단하기 어렵습니다. 관심 있는 도구를 조사할 때 원래 응답과 비교 기준을 다시 볼 수 있도록 수집·정규화·순위 조회를 나눠 구현했습니다.

대상은 별이 5,000개 이상인 공개 비포크 저장소입니다. 이 후보군 안에서 관측한 변화를 다루며 GitHub 전체의 트렌드나 완전한 전수 수집을 주장하지 않습니다. 제가 수집 범위 분할, 원본·상태 저장, SQL 조회와 보고서 생성 경로를 만들었습니다.

원본과 수집 범위를 함께 남기는 구조

전체 구조를 먼저 보고, 크게 열어 세부 내용을 확인하세요.크게 보기ExcalidrawMermaid
GitHub 공개 API에서 구간 분할 수집, 원본과 커버리지, Parquet 스냅샷, DuckDB 비교 뷰, 범위와 제외 사유를 포함한 보고서로 이어지는 흐름
공개 GitHub 후보를 구간별로 수집해 원본과 범위 기록을 남기고 Parquet 관측치로 정규화합니다. DuckDB는 실제 기준일 관측이 있는 저장소만 비교합니다. 현재 정기 실행 전이며 GitHub 전체의 완전성을 보장하지 않습니다.

API 응답은 요청·수신 시각·HTTP 상태·허용한 응답 헤더와 함께 압축된 원본으로 보존합니다. 어떤 구간을 요청했고 어디가 실패하거나 미시도 상태인지 별도 커버리지 매니페스트에 기록합니다. 응답을 받았다는 사실과 후보군을 충분히 확인했다는 판단을 분리하기 위해서입니다.

Silver에는 날짜별 Parquet 스냅샷과 저장소별 최신 관측 메타데이터를 두고, Gold에는 DuckDB SQL 뷰를 둡니다. 보고서 조회가 매번 API를 호출하거나 원본 전체를 다시 파싱하지 않게 했습니다. 원본에서 다시 만드는 명령과 저장된 관측치를 조회하는 명령도 분리했습니다.

검색 한도와 중간 실패를 수집 상태로 표현하기

GitHub 검색은 결과 수에 한도가 있어 큰 별 개수 구간을 한 번 조회하는 방식으로는 후보가 잘릴 수 있습니다. 별 개수 구간을 적응적으로 쪼개고, 같은 별 개수에 후보가 몰리면 생성 시각 구간으로 다시 나누도록 했습니다. 더 나눌 수 없거나 응답이 불완전하면 해당 날짜의 수집 범위에 공백을 남깁니다.

같은 날 재실행할 때 성공한 페이지는 재사용하고 실패·미시도 구간을 보충합니다. ETag가 있으면 조건부 요청을 보내며, 변경 없음 응답은 실제 빈 응답과 원래 불변 응답의 연결을 함께 저장합니다. 원래 응답을 찾지 못하면 일반 요청으로 다시 확인합니다.

요청 간격, 재시도 횟수, 대기 시간과 요청 예산을 제한했습니다. 제한에 걸린 구간을 조용히 누락시키지 않고 보고서에 드러내며, 깨진 정상 응답도 원본에는 보존하되 집계에서는 제외합니다. 검색 중 별 수가 바뀌어 구간을 넘나드는 경우까지 완전성을 보장할 수는 없습니다.

이름이 바뀌어도 같은 저장소를 비교하기

저장소 이름 대신 GitHub 저장소 ID를 관측치의 식별자로 사용했습니다. 이름이 바뀌어도 같은 저장소의 이력을 이어서 비교하고, 같은 날 여러 번 관측되면 수신 시각을 기준으로 사용할 값을 고릅니다.

성장량은 종료일과 정해진 이전 기준일 양쪽에 실제 관측치가 있을 때만 계산합니다. 기준일이 없다고 별 수를 영으로 채우지 않고 비교 대상에서 제외합니다. 보고서에는 새로 관측된 후보와 기준일 누락을 나누고, 부분 수집에 의한 순위임을 표시합니다.

일·주·월·년 비교는 정해진 길이의 이동 구간으로 정의했습니다. 달력 기간과 혼동하지 않도록 설명하고 동률 순위, 이전 비교 구간의 순위, 순위 변화가 불명인 경우를 SQL에 반영했습니다. 첫날 보고서는 누적 별 수를 보여주는 시작 스냅샷이며 실제 성장 순위와 구분합니다.

AI 동향은 출처별 관측과 교차 확인으로 조사

관련 도구로 Hugging Face, Hacker News, GeekNews, Reddit 등 공개 소스의 AI 동향을 수집하는 별도 시제품을 구현했습니다. 반응 수와 게시 시각의 의미가 소스마다 달라, 점수 구성요소와 원문 링크를 남기고 서로 다른 플랫폼에서 같은 이야기가 관측되었는지 확인하도록 했습니다.

URL의 추적 인자와 조각을 정리하되 식별에 필요한 쿼리는 유지하고, 제목·명시적 모델 URL을 기준으로 중복 후보를 묶습니다. 의미가 비슷하다는 추정만으로 합치지 않아 표현이 다른 같은 뉴스를 놓칠 수 있습니다. 모델 메모리 추정도 명시된 크기에 한정하며 실제 로컬 실행을 보장하지 않습니다.

시험 수집에서 Reddit 접근 거절과 확인되지 않은 RSS 주소가 있었습니다. 차단을 우회하지 않고 실패·빈 결과·파싱 오류를 구분해 남겼습니다. 요약과 알림 경로는 마련했지만 이 시제품도 정기 실행을 가동한 상태로 적지 않았습니다.

현재 확인한 것과 앞으로 쌓아야 할 것

GitHub 수집기와 조회 도구를 구현하고 오프라인 회귀 검증 및 실제 공개 API의 제한된 시험 수집을 진행했습니다. 현재는 수동 실행 단계이며, 서로 다른 기준일의 실제 관측 이력이 부족해 성장 순위 산출을 확인하지 못했습니다. 장기간 누적 운영 실적이나 정기 알림 발송 성과는 주장하지 않습니다.

다음 단계는 요청 예산과 소스별 누락 상태를 보며 관측 이력을 쌓고, 비교 기준일이 생겼을 때 실제 순위와 보고서의 제외 사유를 확인하는 일입니다. GitHub 검색의 범위 제약과 AI 동향 소스의 접근 실패가 남아 있으며, 시험 통과를 모든 외부 응답의 정상 처리로 확대하지 않았습니다.