调用GitHub API获取Python高星仓库每次结果不一致的问题排查
问题原因与解决方案
为什么结果每次不同?
GitHub搜索API按stars排序时,若多个仓库星标数相同,会自动以仓库最后更新时间降序作为二次排序规则。而仓库的更新(提交、Issue、PR等操作)是实时发生的,这就导致星标数相同的仓库在每次请求中的顺序会变化,整体结果看起来不一致。
为什么仓库数量有差异?
- 默认分页限制:GitHub搜索API默认仅返回第一页30条数据,如果搜索结果总数实时变化(比如新仓库创建、已有仓库星标数变动导致排名调整),第一页的内容会出现增减。
- API异常未处理:如果遇到速率限制或网络问题,请求可能返回错误状态码(如403),导致获取到的仓库数量不足。
改进后的代码实现
import requests import pandas as pd API_KEY = "你的GitHub令牌" base_url = "https://api.github.com/search/repositories" # 构造请求参数,每页最多获取100条(API允许的最大值) request_params = { "q": "language:python", "sort": "stars", "order": "desc", "per_page": 100 } headers = {'Authorization': f'token {API_KEY}'} all_repositories = [] current_page = 1 while True: request_params["page"] = current_page response = requests.get(base_url, headers=headers, params=request_params) # 检查请求是否成功 if response.status_code != 200: print(f"请求异常,状态码: {response.status_code}") break response_data = response.json() page_repos = response_data.get("items", []) if not page_repos: break # 没有更多数据,终止循环 all_repositories.extend(page_repos) # 判断是否已获取所有结果(API最多返回1000条结果) total_count = response_data["total_count"] if current_page * request_params["per_page"] >= min(total_count, 1000): break current_page += 1 # 转换为DataFrame并做稳定排序 repo_df = pd.DataFrame(all_repositories) # 先按星标数降序,再按仓库ID升序(ID唯一且固定,保证排序稳定) sorted_repo_df = repo_df.sort_values( by=["stargazers_count", "id"], ascending=[False, True] ) print(f"最终获取到 {len(sorted_repo_df)} 个Python高星仓库")
关键优化点
- 完整分页获取:通过循环请求所有分页,拿到API允许的最多1000条结果(这是GitHub搜索API的硬限制)。
- 稳定本地排序:用仓库ID作为二次排序字段,避免API动态二次排序规则导致的结果波动。
- 异常状态处理:及时捕获请求错误,避免因速率限制或网络问题导致的数据缺失。
内容的提问来源于stack exchange,提问作者EscA
相关产品推荐
相关产品推荐

