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条导致循环提前退出。
快速排查步骤
- 加日志:在每次请求后打印
pageNumber、当前页的items数量、已获取的总数量、API返回的total_count,定位哪一步出问题。 - 临时替换
set()为list(),排除去重影响。 - 检查是否有请求失败的页面,补充错误处理逻辑。
内容的提问来源于stack exchange,提问作者BooRuleDie
相关产品推荐
相关产品推荐

