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

GitHub API代码搜索结果缺失4条数据,请求排查原因

问题:GitHub代码搜索API获取结果缺失部分文件URL

我正在开发一款工具,需要获取GitHub代码搜索结果中所有文件的URL。比如搜索“uber.com api_key”时,网页显示有381条代码结果,但我用GitHub API V3编写的Python函数仅获取到377条文件URL,已确认数据库写入函数无问题,想知道是GitHub API返回数据缺失,还是我的代码逻辑有误。

我的Python函数如下:

def fetchItems(search, GITHUB_API):   
    
    items = set()
    response = {"items":[1]}
    pageNumber = 1
    
    while(response["items"]):
        
        sleep(3) # 尝试避免限流,但好像没用 :(

        url = "https://api.github.com/search/code"
        params = {
            "q" : search,
            "per_page" : 30, # 默认值,可以调到100
            "page" : pageNumber
        }  
        headers = {
            "Accept" : "application/vnd.github+json",
            "Authorization" : f"Bearer {GITHUB_API}"
        }

        r = requests.get(url=url, headers=headers, params=params, verify=False)
        
        if r.status_code == 403: # 触发限流时,等待到重置时间
            epochReset = int(r.headers["X-Ratelimit-Reset"])
            epochNow = time()

            if epochNow < epochReset:
                sleep((epochReset - epochNow) + 1)
            
            sleep(1)
            continue
        
        response = json.loads(r.text)
    
        for file in response["items"]:
            items.add(file["html_url"])
        
        pageNumber += 1
    
    return items

分析与解决办法

1. 代码逻辑的潜在问题

  • 重复URL被去重:你用set()存储URL,而GitHub搜索结果可能包含重复的文件URL(比如同一文件在不同分支被索引),这会导致最终数量比网页显示少。可以先把set()改成list(),对比总数是否匹配,排查是否是去重导致的差异。
  • 未处理其他错误状态:如果API返回500、502等服务器错误,你的代码直接解析JSON会报错,导致循环提前终止,遗漏后续页面。建议增加状态码判断,非200且非403时,要么重试,要么记录错误后跳过:
    if r.status_code not in [200, 403]:
        print(f"Page {pageNumber} failed with status {r.status_code}")
        # 可选:重试2-3次后再跳过
        continue
    
  • 未处理无items的异常响应:如果API返回的JSON中没有items字段(比如搜索失败),遍历response["items"]会报错,导致循环中断。可以先判断:
    response = json.loads(r.text)
    if "items" not in response:
        print(f"Page {pageNumber} has no items: {response}")
        continue
    

2. GitHub API的限制与差异

  • 搜索结果的总数差异:网页端和API的搜索结果可能存在细微差异,比如网页端会包含一些API未索引的内容,或者API返回的total_count本身就小于网页显示数。建议在代码中打印API返回的total_count字段,确认API给出的总条数:
    print(f"API reported total items: {response.get('total_count', 0)}")
    
  • 分页边界问题:GitHub API的分页最大支持per_page=100,如果用30的话,381条需要13页(30*12=360,第13页21条)。可以在代码中打印每一页的items数量,看是否最后一页的数量正确,或者是否有某一页返回0条导致循环提前退出。

快速排查步骤

  1. 加日志:在每次请求后打印pageNumber、当前页的items数量、已获取的总数量、API返回的total_count,定位哪一步出问题。
  2. 临时替换set()为list(),排除去重影响。
  3. 检查是否有请求失败的页面,补充错误处理逻辑。

内容的提问来源于stack exchange,提问作者BooRuleDie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:45:32