# 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에 걸쳐 읽기를 라우팅하면 여유 공간이 늘어나는 이유입니다.

```python
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이므로, 간단한 요청 및 파싱이 작동합니다 - 브라우저가 필요 없습니다.

```python
import requests
from bs4 import BeautifulSoup

# Scrape the trending page through a datacenter proxy
PROXY = "http://USER-type-datacenter:PASS@datacenterboson.quantumproxies.io:10000"

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 REST 제한: 토큰 없이는 IP당 집계되는 시간당 60건, 인증 토큰이 있으면 5,000건. 카드는 IP당 상한, 분당 30건인 Search API, 그리고 여러 IP에 읽기 요청을 분산하면 여유 용량이 배로 늘어나는 이유를 강조합니다.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335184/blog/generated/qp-b9-050-diag1.png)
*인증되지 않은 한계는 IP당 계산됩니다 - 이것이 읽기를 풀에 분산시키는 것이 효과적인 이유입니다.*

## GitHub는 데이터센터 (그리고 아마도 IPv6) 대상입니다

여기서 사람들이 과도하게 설계하는 부분이 있습니다. GitHub의 공개 페이지는 서버 렌더링되며, 관대한 JavaScript 도전이 없으므로 읽기 위해 프리미엄 주거 IP가 필요하지 않습니다. 이것은 [데이터센터 프록시](https://quantumproxies.io/datacenter-proxies)의 교과서적인 사례입니다: 저렴하고 빠르며 풍부하며, 인증되지 않은 한계에 도달하거나 2차 속도 제한을 초과하지 않도록 넓게 퍼져 있습니다. 여기서 주거를 선택하는 것은 경제 IP로 완벽하게 수행할 수 있는 작업에 대해 고급 가격을 지불하는 것입니다. [데이터센터 프록시를 언제 사용하는 것이 적합한지](https://quantumproxies.io/blog/datacenter-proxies-when-to-use)에 대한 우리의 가이드는 바로 이러한 관대하고 높은 처리량의 대상을 설명합니다.

테스트할 가치가 있는 더 저렴한 옵션이 있습니다: IPv6. 대상이 IPv6을 통해 응답할 때, [IPv6 프록시 풀](https://quantumproxies.io/ipv6-proxies)은 거대한 저비용 주소 공간을 제공합니다 - 수천 개의 출구에 걸쳐 IP당 제한된 읽기를 분산시키기에 이상적입니다. GitHub는 IPv6 지원을 롤아웃하고 있으므로, 이는 가정하지 않고 확인할 가치가 있는 몇 안 되는 대형 대상 중 하나입니다. 커밋하기 전에 테스트하세요: 우리의 [무료 IPv6 호환성 검사기](https://quantumproxies.io/ipv6-compatibility-checker)를 통해 대상을 실행하고, [완전한 IPv6 프록시 가이드](https://quantumproxies.io/blog/ipv6-proxies-complete-guide)에서 경제성을 읽어보세요.

[GitHub를 위한 빠른 데이터센터 프록시 얻기](https://quantumproxies.io/datacenter-proxies)

## 2차 속도 제한에 주의하세요

시간당 한계는 당신이 만날 유일한 제한자가 아닙니다. GitHub는 또한 남용 감지를 실행하여 폭발적이거나, 매우 동시적이거나, 의심스럽게 규칙적인 트래픽에 반응합니다 - 따라서 숫자 제한 아래에서 편안하게 앉아 있어도, 단일 IP에서의 과도한 요청은 일시적인 차단을 초래할 수 있습니다. 방어는 당신을 예의 바른 클라이언트로 만드는 동일한 것들입니다: 동시성을 제한하고, 요청 사이에 약간의 지터를 추가하며, 서버가 제공하는 `Retry-After` 헤더를 존중하고, 단일 출구가 과도한 패턴을 가지지 않도록 부하를 분산시키세요. 이것이 넓은 풀이 중요한 진짜 이유입니다 - 단순히 시간당 60개의 산술이 아니라, 개별 IP가 스크립트가 잘못된 것처럼 보이지 않도록 하는 것입니다. 첫 번째 403이나 속도 저하에서 후퇴하고, 더 긴 금지로 바로 재시도하지 마세요.

## 리포 데이터를 개발 도구 인텔로 전환하기

이 모든 것의 요점은 분석 계층입니다. 경쟁자 라이브러리의 스타 속도와 종속성 수를 시간에 따라 추적하면 실시간으로 채택을 관찰할 수 있습니다. 언어별로 주간 트렌딩 페이지를 비교하여 명확해지기 전에 떠오르는 도구를 발견하세요. 팀 크기와 채용 신호를 읽기 위해 기여자 목록을 가져오세요. 주제에 걸쳐 언어 분포를 결합하여 전체 생태계를 매핑하세요. 일정에 따라 저장소를 스냅샷하고, 각 캡처를 타임스탬프와 함께 저장하면 델타가 제품이 됩니다 - 모멘텀, 단일 숫자가 아닙니다. 40,000개의 스타를 한 번 읽는 것은 사소한 일입니다; 동일한 저장소가 주당 2,000개의 스타를 추가하면서 종속성 수가 증가하는 것은 더 넓은 시장이 알아차리기 전에 행동할 수 있는 진정한 채택 신호입니다.

```python
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-type-datacenter:PASS@datacenterboson.quantumproxies.io:10000"
    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'
```

한 가지 습관은 대량에서 비용을 합리적으로 유지합니다: 필요한 것만 요청하세요. 리포 페이지는 가볍지만, 수천 개의 저장소로 확장하면 자산을 차단하고 연결을 재사용하세요 - [프록시 대역폭 절감](https://quantumproxies.io/blog/reduce-proxy-bandwidth-costs-scraping)에 대한 우리의 노트는 저렴한 대상에도 적용됩니다, 왜냐하면 이익이 복합되기 때문입니다.

![GitHub 스크래핑을 위한 세 가지 프록시 유형을 비용 척도에 놓은 모습: 맨 위의 주거용은 과잉이고, 데이터센터가 적합한 도구이며, IPv6는 테스트를 거치면 가장 저렴합니다. 카드는 이렇게 요약합니다: 데이터센터는 저렴하고 빠르며 풍부하고, IPv6는 거대한 주소 공간을 제공하며, 주거용은 더 까다로운 사이트용입니다.](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335184/blog/generated/qp-b9-050-diag2.png)
*관대한 공개 대상을 위해, 데이터센터 및 IPv6 IP는 비용에서 승리합니다; 주거는 더 어려운 사이트를 위해 아껴두세요.*

## 자주 묻는 질문

### 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을 테스트하고, 데이터센터 풀에 의존하면, 전체 플랫폼이 실시간 개발 생태계 데이터셋이 됩니다.

[대량의 GitHub 읽기를 위한 IPv6 프록시를 시도하세요](https://quantumproxies.io/ipv6-proxies)
