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

调用GitHub API获取Python高星仓库每次结果不一致的问题排查

问题原因与解决方案

为什么结果每次不同?

GitHub搜索API按stars排序时,若多个仓库星标数相同,会自动以仓库最后更新时间降序作为二次排序规则。而仓库的更新(提交、Issue、PR等操作)是实时发生的,这就导致星标数相同的仓库在每次请求中的顺序会变化,整体结果看起来不一致。

为什么仓库数量有差异?

  1. 默认分页限制:GitHub搜索API默认仅返回第一页30条数据,如果搜索结果总数实时变化(比如新仓库创建、已有仓库星标数变动导致排名调整),第一页的内容会出现增减。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:25:57