You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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.'}

遇到两个问题:

  1. 仅第二次循环后就触发了二级速率限制(secondary rate limit)
  2. 每页结果数不一致,比如本次运行第一页显示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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 19:35:25