如何通过GitHub Search API高效获取全部1000条搜索结果?
关于GitHub Search API获取全量结果的问题
我了解GitHub Search API限制最多返回1000条结果,且每页最多100条。因此我编写了以下代码,用于搜索文件中包含字符串torch的Python代码,以获取全部1000条结果:
import requests for i in range(1,11): url = "https://api.github.com/search/code?q=torch +in:file + language:python&per_page=100&page="+str(i) headers = { 'Authorization': 'xxxxxxxx' } response = requests.request("GET", url, headers=headers).json() try: print(len(response['items'])) except: print("response = ", response)
运行输出如下:
15 62 response = {'documentation_url': 'https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#secondary-rate-limits', 'message': 'You have exceeded a secondary rate limit. Please wait a few minutes before you try again.'}
遇到两个问题:
- 仅第二次循环后就触发了二级速率限制(secondary rate limit)
- 每页结果数不一致,比如本次运行第一页显示15条,但再次运行时数值会变化,我认为每页应该返回100条。
请问是否存在高效获取Search API全部1000条结果的方法?
解决方案
针对二级速率限制
GitHub的二级速率限制是防止高频请求的防护机制,哪怕没超出基础请求配额,短时间内连续发起请求也会触发。解决思路:
- 添加请求延时:每次请求后sleep 2-3秒,降低请求密度,避免触发高频检测
- 响应头限速判断:每次请求后读取
X-RateLimit-Remaining和X-RateLimit-Reset字段,当剩余请求数不足时,等待到重置时间后再继续请求 - 不要硬循环刷页码,结合响应状态码处理重试逻辑,遇到403时自动等待
针对每页结果数波动
Search API的per_page=100是最大返回数,并非固定返回值。结果数波动的原因:
- 搜索结果本身不足100条(比如接近结果末尾的页数)
- GitHub搜索结果有实时更新、去重机制,不同时间请求的结果会存在差异
- 部分仓库因权限或未被索引,无法返回结果
这种情况是API的正常特性,无法强制每页返回100条,只能接受波动,同时确保查询语句准确以减少不必要的结果偏差。
优化后的代码示例
import requests import time headers = {'Authorization': 'xxxxxxxx'} base_url = "https://api.github.com/search/code?q=torch+in:file+language:python&per_page=100" total_results = [] current_page = 1 while current_page <= 10: # 对应1000条结果上限 req_url = f"{base_url}&page={current_page}" resp = requests.get(req_url, headers=headers) # 处理403速率限制 if resp.status_code == 403: reset_ts = int(resp.headers.get('X-RateLimit-Reset', time.time() + 60)) wait_sec = reset_ts - time.time() + 5 print(f"触发限速,等待{wait_sec:.1f}秒") time.sleep(wait_sec) continue resp_data = resp.json() if 'items' not in resp_data: print(f"请求出错: {resp_data}") break page_items = resp_data['items'] total_results.extend(page_items) print(f"第{current_page}页拿到{len(page_items)}条,累计{len(total_results)}条") # 当前页不足100条,说明已经到最后一页 if len(page_items) < 100: print("已获取全部可用结果") break current_page += 1 time.sleep(2) # 基础延时防高频请求 print(f"最终共获取{len(total_results)}条结果")
额外提示
- 确保Token有效,认证后请求配额更高(30次/分钟 vs 未认证10次/分钟)
- Search API的1000条结果上限是硬限制,无法突破
- 可以优化查询语句,比如用更精确的关键词减少结果波动
内容的提问来源于stack exchange,提问作者desert_ranger
相关产品推荐
相关产品推荐

