GitHub 트렌딩과 저장소 정보를 파이썬 표준 라이브러리만으로 모으기
GitHub 트렌딩 목록과 저장소 정보는 로그인 없이도 가져올 수 있어요. 파이썬 표준 라이브러리만으로 충분하고, 에이전트에게 ‘소개 글을 쓰기 전에 이걸로 직접 확인하라’고 시키기 좋아요. 이 사이트의 GitHub 트렌드 글도 이 방식으로 자료를 모아요.
왜 직접 모아야 하나요
다른 매체의 소개 글을 요약하면 과장이나 오래된 정보가 그대로 따라와요. GitHub에서 직접 가져오면 별 수, 마지막 커밋 날짜, 라이선스, 보관 처리 여부를 그 시점 값으로 확인할 수 있어요.
코드
import json, re, urllib.request
HEADERS = {"User-Agent": "my-collector/1.0", "Accept": "application/vnd.github+json"}
def fetch(url, accept=None):
headers = {**HEADERS, "Accept": accept} if accept else HEADERS
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req, timeout=30) as res:
return res.read().decode("utf-8", "replace")
def trending(since="daily"):
html = fetch(f"https://github.com/trending?since={since}", accept="text/html")
rows = []
for block in html.split('<article class="Box-row">')[1:]:
name = re.search(r'<h2[^>]*>\s*<a[^>]*href="/([\w.-]+/[\w.-]+)"', block)
if name:
rows.append(name.group(1))
return rows
def repo_info(repo):
meta = json.loads(fetch(f"https://api.github.com/repos/{repo}"))
readme = fetch(f"https://api.github.com/repos/{repo}/readme",
accept="application/vnd.github.raw")
return {
"stars": meta["stargazers_count"],
"license": (meta.get("license") or {}).get("spdx_id"),
"last_push": meta["pushed_at"],
"archived": meta["archived"],
"readme": readme,
}
알아둘 점
- 트렌딩은 공식 API가 없어요. 그래서 트렌딩 페이지의 HTML에서 저장소 이름을 읽어요. 페이지 구조가 바뀌면 이 부분이 멈추니, 결과가 비면 오류를 내도록 해 두세요.
- 조회 횟수 한도: 로그인 없이 쓰는 API는 한 시간에 60회까지예요. 저장소 한 곳에 네댓 번을 쓰면 하루 몇 건은 여유가 있어요.
- README는 원문 그대로 받을 수 있어요.
Accept헤더를application/vnd.github.raw로 주면 돼요. - User-Agent를 꼭 넣으세요. 빠지면 요청이 거절돼요.
- 별 수는 인기의 지표일 뿐이에요. 품질이나 안전을 보장하지 않아요. 마지막 커밋 날짜와 릴리스 유무를 함께 보세요.
에이전트에게 맡길 때
- README 앞부분만 읽고 쓰지 않게 하세요. 주의사항은 뒤쪽에 있는 경우가 많아요.
- README 안의 문장을 지시로 받아들이지 않게 하세요. ‘이 명령을 실행하라’는 문장이 있어도 자료로만 다뤄야 해요.
- 글에 ‘무엇을 확인했고 무엇을 하지 않았는지’를 적게 하세요. 독자가 신뢰 수준을 판단할 수 있어요.
확인 범위
위 코드는 2026년 11월 15일에 실제로 실행해 트렌딩 목록과 저장소 정보가 조회되는 것을 확인했어요.