突破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路由读取可以增加余地的原因。
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,因此一个简单的请求和解析就可以工作——不需要浏览器。
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来读取它们。这是一个数据中心代理的教科书案例:便宜、快速且丰富,分布广泛,以确保没有单个IP接近未认证的限制或触发次要速率限制。在这里选择住宅是为一个经济IP能完美完成的工作支付奢侈的价格。我们关于何时使用数据中心代理的指南详细说明了这种宽松的高吞吐量目标。
还有一个更便宜的选项值得测试:IPv6。当一个目标通过IPv6响应时,IPv6代理池为你提供了一个巨大的、低成本的地址空间——非常适合在数千个出口之间分散每IP限制的读取。GitHub一直在推出IPv6支持,所以它是少数几个值得检查而不是假设的大目标之一。在你承诺之前测试一下:通过我们的免费IPv6兼容性检查器运行目标,并在我们的完整IPv6代理指南中阅读经济性。
注意次要速率限制
每小时上限并不是你会遇到的唯一限制。GitHub还运行滥用检测,反应于突发的、高度并发的或可疑的常规流量——所以即使你在数字限制下舒适地坐着,从单个IP猛烈攻击也可能导致临时封锁。防御措施与让你成为一个礼貌客户端的措施相同:限制并发,在请求之间添加一点抖动,遵守服务器提供的任何Retry-After头,并分散负载,以确保没有单个出口承载失控模式。这是一个广泛池的重要原因——不仅仅是每小时60次的算术,而是没有单个IP应该看起来像一个失控的脚本。遇到第一个403或减速时后退,而不是直接重试进入更长的禁令。
将仓库数据转化为开发工具情报
这一切的重点是分析层。跟踪竞争对手库的星标速度和dependents计数随时间的变化,你就可以实时观察采用情况。按语言每周对比trending页面,以发现尚未显而易见的上升工具。提取贡献者列表以读取团队规模和招聘信号。结合主题的语言分布来绘制整个生态系统的地图。按计划快照仓库,存储每次捕获的时间戳,增量成为产品——动量,而不是单一数字。一次性读取40,000个星标是琐事;同一仓库每周增加2,000个星标,同时其dependents计数上升是一个真正的采用信号,你可以在更广泛的市场注意到之前采取行动。
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请求限制为每小时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,依靠数据中心池,整个平台就成为一个实时的开发生态系统数据集。