API 제한을 넘어서 GitHub 데이터 스크래핑하기: 스타, 종속성
GitHub의 API는 인증되지 않은 호출을 시간당 60개로 제한하고, 종속성과 트렌딩을 완전히 숨깁니다. 저렴한 IP를 통해 중요한 신호를 추출하는 방법을 소개합니다.
GitHub는 연구의 금광입니다 - 채택 곡선, 경쟁자 모멘텀, 종속성 그래프, 채용 신호 - 그리고 공식 API는 그 일부를 무료로 제공합니다. 그러나 인증되지 않은 호출은 시간당 60개로 제한되며, 사람들이 가장 원하는 두 가지 데이터셋인 종속성 그래프와 트렌딩 페이지는 API에 전혀 포함되어 있지 않습니다. 이 가이드는 이러한 한계를 넘어서 GitHub 데이터를 스크래핑하는 방법을 다룹니다: API가 제공하는 것, HTML에서 읽어야 하는 것, 그리고 왜 GitHub가 저렴한 데이터센터 및 IPv6 프록시가 적합한 드문 대상인지 설명합니다.
한계를 알기 전에 싸우세요
API로 시작하세요 - 구조화되어 있고, 승인받았으며, 인증하면 할당량이 저렴합니다. 모든 것을 형성하는 숫자: 인증되지 않은 REST 요청은 IP당 시간당 60개로 제한됩니다; 인증된 토큰은 시간당 5,000개를 얻습니다; 검색 API는 인증된 경우 분당 30개 요청(인증되지 않은 경우 10개)으로 더 엄격합니다. 중요한 세부 사항은 인증되지 않은 한계가 IP당으로 계산된다는 것입니다 - 이것이 바로 여러 IP에 걸쳐 읽기를 라우팅하면 여유 공간이 늘어나는 이유입니다.
import requests
# Authenticated API call - watch the rate-limit headers
headers = {"Authorization": "Bearer YOUR_GH_TOKEN",
"Accept": "application/vnd.github+json"}
r = requests.get("https://api.github.com/repos/psf/requests", headers=headers, timeout=15)
repo = r.json()
print(repo["stargazers_count"], repo["forks_count"], repo["open_issues_count"])
print("remaining this hour:", r.headers["X-RateLimit-Remaining"])
API가 깔끔하게 노출하는 모든 것에 대해 API를 사용하고, 파일 내용을 위해 git clone을 사용하세요 - 리포를 로컬에서 클론하고 처리하는 것이 개별 파일 페이지를 스크래핑하는 것보다 빠르고 부드럽습니다. HTML 스크래핑은 API 속도 제한으로 쓸모없거나 완전히 누락된 신호를 위한 것입니다.
HTML에서 읽어야 하는 것
세 가지 고가치 데이터셋은 렌더링된 페이지에만 존재합니다. 종속성 그래프 - GitHub의 "사용 중" 수와 패키지에 의존하는 저장소 목록 - 는 가장 강력한 채택 지표 중 하나이며, API에 포함되어 있지 않습니다. 트렌딩 페이지 (github.com/trending, 언어 및 창별로 필터링 가능)는 HTML 전용입니다. 그리고 토픽 페이지는 검색 할당량이 허용하는 것보다 훨씬 더 유용하게 주제별로 저장소를 표면화합니다. 이 세 가지는 모두 서버 렌더링된 HTML이므로, 간단한 요청 및 파싱이 작동합니다 - 브라우저가 필요 없습니다.
import requests
from bs4 import BeautifulSoup
# Scrape the trending page through a datacenter proxy
PROXY = "http://USER:PASS@dc.quantumproxies.io:8000"
def trending(language="python", since="daily"):
url = f"https://github.com/trending/{language}?since={since}"
r = requests.get(url, proxies={"https": PROXY}, timeout=20,
headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(r.text, "html.parser")
repos = []
for row in soup.select("article.Box-row"):
name = row.select_one("h2 a")["href"].strip("/")
stars = row.select_one("a[href$='/stargazers']")
repos.append({"repo": name,
"stars": stars.get_text(strip=True) if stars else None})
return repos
print(trending("rust", "weekly")[:5])

GitHub는 데이터센터 (그리고 아마도 IPv6) 대상입니다
여기서 사람들이 과도하게 설계하는 부분이 있습니다. GitHub의 공개 페이지는 서버 렌더링되며, 관대한 JavaScript 도전이 없으므로 읽기 위해 프리미엄 주거 IP가 필요하지 않습니다. 이것은 데이터센터 프록시의 교과서적인 사례입니다: 저렴하고 빠르며 풍부하며, 인증되지 않은 한계에 도달하거나 2차 속도 제한을 초과하지 않도록 넓게 퍼져 있습니다. 여기서 주거를 선택하는 것은 경제 IP로 완벽하게 수행할 수 있는 작업에 대해 고급 가격을 지불하는 것입니다. 데이터센터 프록시를 언제 사용하는 것이 적합한지에 대한 우리의 가이드는 바로 이러한 관대하고 높은 처리량의 대상을 설명합니다.
테스트할 가치가 있는 더 저렴한 옵션이 있습니다: IPv6. 대상이 IPv6을 통해 응답할 때, IPv6 프록시 풀은 거대한 저비용 주소 공간을 제공합니다 - 수천 개의 출구에 걸쳐 IP당 제한된 읽기를 분산시키기에 이상적입니다. GitHub는 IPv6 지원을 롤아웃하고 있으므로, 이는 가정하지 않고 확인할 가치가 있는 몇 안 되는 대형 대상 중 하나입니다. 커밋하기 전에 테스트하세요: 우리의 무료 IPv6 호환성 검사기를 통해 대상을 실행하고, 완전한 IPv6 프록시 가이드에서 경제성을 읽어보세요.
2차 속도 제한에 주의하세요
시간당 한계는 당신이 만날 유일한 제한자가 아닙니다. GitHub는 또한 남용 감지를 실행하여 폭발적이거나, 매우 동시적이거나, 의심스럽게 규칙적인 트래픽에 반응합니다 - 따라서 숫자 제한 아래에서 편안하게 앉아 있어도, 단일 IP에서의 과도한 요청은 일시적인 차단을 초래할 수 있습니다. 방어는 당신을 예의 바른 클라이언트로 만드는 동일한 것들입니다: 동시성을 제한하고, 요청 사이에 약간의 지터를 추가하며, 서버가 제공하는 Retry-After 헤더를 존중하고, 단일 출구가 과도한 패턴을 가지지 않도록 부하를 분산시키세요. 이것이 넓은 풀이 중요한 진짜 이유입니다 - 단순히 시간당 60개의 산술이 아니라, 개별 IP가 스크립트가 잘못된 것처럼 보이지 않도록 하는 것입니다. 첫 번째 403이나 속도 저하에서 후퇴하고, 더 긴 금지로 바로 재시도하지 마세요.
리포 데이터를 개발 도구 인텔로 전환하기
이 모든 것의 요점은 분석 계층입니다. 경쟁자 라이브러리의 스타 속도와 종속성 수를 시간에 따라 추적하면 실시간으로 채택을 관찰할 수 있습니다. 언어별로 주간 트렌딩 페이지를 비교하여 명확해지기 전에 떠오르는 도구를 발견하세요. 팀 크기와 채용 신호를 읽기 위해 기여자 목록을 가져오세요. 주제에 걸쳐 언어 분포를 결합하여 전체 생태계를 매핑하세요. 일정에 따라 저장소를 스냅샷하고, 각 캡처를 타임스탬프와 함께 저장하면 델타가 제품이 됩니다 - 모멘텀, 단일 숫자가 아닙니다. 40,000개의 스타를 한 번 읽는 것은 사소한 일입니다; 동일한 저장소가 주당 2,000개의 스타를 추가하면서 종속성 수가 증가하는 것은 더 넓은 시장이 알아차리기 전에 행동할 수 있는 진정한 채택 신호입니다.
import requests
from bs4 import BeautifulSoup
# The 'Used by' dependents count - a top adoption signal, HTML-only
def used_by(owner, repo):
url = f"https://github.com/{owner}/{repo}/network/dependents"
proxy = "http://USER:PASS@dc.quantumproxies.io:8000"
r = requests.get(url, proxies={"https": proxy}, timeout=20,
headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(r.text, "html.parser")
tab = soup.select_one("a.btn-link.selected")
return tab.get_text(strip=True) if tab else None
print(used_by("pallets", "flask")) # e.g. '1.4m Repositories'
한 가지 습관은 대량에서 비용을 합리적으로 유지합니다: 필요한 것만 요청하세요. 리포 페이지는 가볍지만, 수천 개의 저장소로 확장하면 자산을 차단하고 연결을 재사용하세요 - 프록시 대역폭 절감에 대한 우리의 노트는 저렴한 대상에도 적용됩니다, 왜냐하면 이익이 복합되기 때문입니다.

자주 묻는 질문
GitHub의 API 속도 제한은 무엇인가요?
인증되지 않은 REST 요청은 IP 주소당 시간당 60개로 제한됩니다. 인증된 토큰은 이를 시간당 5,000개로 올립니다. 검색 API는 별도로, 더 엄격하게 - 인증된 경우 분당 30개 요청, 인증되지 않은 경우 10개로 제한됩니다. 인증되지 않은 제한이 IP당이기 때문에, 프록시 풀에 걸쳐 읽기를 분산시키는 것은 수집을 확장하는 효과적인 방법입니다.
API가 노출하지 않는 GitHub 데이터를 스크래핑할 수 있나요?
네. 종속성 그래프("사용 중"), 트렌딩 페이지, 주제 목록 및 스타게이저 타임라인은 HTML 전용이거나 API를 통해 심하게 할당량이 제한됩니다. 이들은 모두 서버 렌더링된 페이지이므로, BeautifulSoup을 사용한 요청 및 파싱이 브라우저 없이 작동합니다. 데이터센터 프록시를 통해 라우팅하고 읽기를 분산시켜 2차 속도 제한을 피하세요.
GitHub에 주거 프록시가 필요한가요?
보통은 아닙니다. GitHub의 공개 페이지는 관대하고, 서버 렌더링되며, 공격적인 JavaScript 도전이 없으므로 저렴한 데이터센터 프록시로 잘 처리됩니다 - 목표는 요청을 IP에 걸쳐 분산시키는 것이지, 이를 가정으로 위장하는 것이 아닙니다. 대상이 IPv6을 통해 응답한다면, IPv6 풀은 더욱 저렴합니다. 진정으로 적대적인 대상을 위해 주거 IP를 예약하세요.
git clone을 사용해야 하나요 아니면 파일 페이지를 스크래핑해야 하나요?
파일 내용을 위해 클론하세요. git clone을 실행하고 리포를 로컬에서 처리하는 것이 더 빠르고, GitHub에 부드럽고, 개별 파일 속도 제한을 완전히 피합니다. HTML 스크래핑과 API는 체크아웃된 파일 자체에서 얻을 수 없는 메타데이터 및 신호 - 스타, 종속성, 트렌딩, 기여자 - 를 위해 예약하세요.
GitHub는 계층화된 접근 방식을 보상합니다: 관대한 곳에서는 API, 파일을 위해 git clone, 그리고 숨겨진 채택 신호를 위한 HTML 스크래핑 - 모두 저렴한 IP에 걸쳐 분산되어 단일 주소가 시간당 60개 벽에 부딪히지 않도록 하세요. IPv6을 테스트하고, 데이터센터 풀에 의존하면, 전체 플랫폼이 실시간 개발 생태계 데이터셋이 됩니다.