# 突破API速率限制抓取GitHub数据：Stars，Dependents

GitHub的API将未认证调用限制在每小时60次，并完全隐藏dependents和trending。以下是如何通过廉价IP挖掘重要信号的方法。

GitHub是一个研究的金矿——采用曲线、竞争对手动向、依赖关系图、招聘信号——其官方API会免费提供一部分数据。然后就停止了。未认证调用被限制在每小时60次，而人们最想要的两个数据集，dependents图和trending页面，根本不在API中。本指南涵盖了如何**抓取GitHub数据**突破这些限制：API提供的内容、需要从HTML读取的内容，以及为什么GitHub是一个使用廉价数据中心和IPv6代理的罕见目标。

## 在挑战之前了解限制

从API开始——它是结构化的、被认可的，并且如果认证的话配额便宜。决定一切的数字：未认证的REST请求限制为每小时60次，按IP计数；认证令牌每小时可达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读取的内容

三个高价值数据集仅存在于渲染页面上。**dependents图**——GitHub的“Used by”计数和依赖于某个包的仓库列表——是最强的采用指标之一，它不在API中。**trending**页面（`github.com/trending`，可按语言和时间窗口过滤）仅为HTML。而**topic**页面按主题展示仓库，比搜索配额更有用。所有这三个都是简单的服务器渲染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 限制：不带令牌时每小时 60 次请求，按 IP 计算，带认证令牌时为 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)的教科书案例：便宜、快速且丰富，分布广泛，以确保没有单个IP接近未认证的限制或触发次要速率限制。在这里选择住宅是为一个经济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)

## 注意次要速率限制

每小时上限并不是你会遇到的唯一限制。GitHub还运行滥用检测，反应于突发的、高度并发的或可疑的常规流量——所以即使你在数字限制下舒适地坐着，从单个IP猛烈攻击也可能导致临时封锁。防御措施与让你成为一个礼貌客户端的措施相同：限制并发，在请求之间添加一点抖动，遵守服务器提供的任何`Retry-After`头，并分散负载，以确保没有单个出口承载失控模式。这是一个广泛池的重要原因——不仅仅是每小时60次的算术，而是没有单个IP应该看起来像一个失控的脚本。遇到第一个403或减速时后退，而不是直接重试进入更长的禁令。

## 将仓库数据转化为开发工具情报

这一切的重点是分析层。跟踪竞争对手库的星标速度和dependents计数随时间的变化，你就可以实时观察采用情况。按语言每周对比trending页面，以发现尚未显而易见的上升工具。提取贡献者列表以读取团队规模和招聘信号。结合主题的语言分布来绘制整个生态系统的地图。按计划快照仓库，存储每次捕获的时间戳，增量成为产品——动量，而不是单一数字。一次性读取40,000个星标是琐事；同一仓库每周增加2,000个星标，同时其dependents计数上升是一个真正的采用信号，你可以在更广泛的市场注意到之前采取行动。

```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请求限制为每小时60次，按IP地址计数。认证令牌将其提高到每小时5,000次。搜索API是独立的并且更严格——认证情况下每分钟30次请求，未认证10次。因为未认证的限制是按IP计数的，分散读取到代理池是扩展收集的有效方法。

### 我可以抓取API未暴露的GitHub数据吗？

可以。dependents图（“Used by”）、trending页面、主题列表和stargazer时间线是仅HTML或通过API严重限额的。它们是简单的服务器渲染页面，因此使用BeautifulSoup的请求和解析无需浏览器即可工作。通过数据中心代理路由并分散读取以保持在次要速率限制之下。

### 我需要GitHub的住宅代理吗？

通常不需要。GitHub的公共页面是宽松的，服务器渲染的，没有激进的JavaScript挑战，所以廉价的数据中心代理可以很好地处理它们——目标是分散请求到多个IP，而不是伪装成家庭。如果目标通过IPv6响应，IPv6池更便宜。将住宅IP保留给真正敌对的目标。

### 我应该使用git clone还是抓取文件页面？

对于文件内容，使用克隆。运行`git clone`并在本地处理仓库比抓取单个文件页面更快，对GitHub更温和，并完全避免每个文件的速率限制。保留HTML抓取和API用于元数据和信号——stars，dependents，trending，contributors——这些是你无法从已检出的文件中获得的。

GitHub奖励分层方法：API在慷慨时使用，git clone用于文件，HTML抓取用于隐藏的采用信号——所有这些都分散在廉价IP上，以确保没有单个地址触及每小时60次的墙。测试IPv6，依靠数据中心池，整个平台就成为一个实时的开发生态系统数据集。

[尝试IPv6代理用于高容量GitHub读取](https://quantumproxies.io/ipv6-proxies)
