Python调用GitHub API搜索仓库仅返回30条结果如何获取更多数据
问题原因
GitHub 搜索类API默认单页返回30条结果,未携带分页参数的请求只会拉取第一页数据,因此最终文件仅会保存30条链接,该限制和个人访问令牌5000次/小时的请求额度无关。
分页相关参数说明
GitHub搜索仓库接口支持两个分页控制参数,直接拼接到请求URL中即可生效:
per_page:单页返回的结果数量,合法取值范围1-100,超过100时接口会自动重置为默认值30page:指定要拉取的页码,从1开始计数
注意:GitHub搜索API有硬限制,单次查询条件最多只能返回前1000条匹配结果,即使翻页超过10页(单页100条)的范围,也无法拿到更多数据。如果需要获取超过1000条结果,可以通过拆分搜索条件(比如按star数区间、仓库创建时间区间拆分多次查询)实现。
修正后的实现代码
import requests import time # 替换为你的个人访问令牌即可,不需要填写用户名 token = "your_personal_access_token_here" headers = {'Authorization': 'token ' + token} # 拉取配置 per_page = 100 # 单页拉满100条,减少总请求次数 page = 1 all_repo_urls = [] while True: print(f"正在拉取第{page}页数据...") # 拼接分页参数到请求地址 url = f"https://api.github.com/search/repositories?q=language:javascript&sort=stars&order=desc&per_page={per_page}&page={page}" resp = requests.get(url, headers=headers) # 处理请求异常 if resp.status_code != 200: print(f"请求出错,状态码:{resp.status_code},返回信息:{resp.text}") break data = resp.json() items = data.get("items", []) # 当前页无数据时停止翻页 if not items: break # 提取仓库主页链接 for item in items: repo_url = item.get("html_url") if repo_url: all_repo_urls.append(repo_url) # 到达1000条接口上限时停止拉取 if len(all_repo_urls) >= 1000: print("已到达搜索接口1000条结果上限,停止拉取") break page += 1 # 增加1秒延时,避免短时间请求过多触发临时限流 time.sleep(1) # 写入本地文件 with open("snapshotJS.txt", "w", encoding="utf-8") as f: for url in all_repo_urls: f.write(url + "\n") print(f"共获取到{len(all_repo_urls)}条仓库链接,已写入snapshotJS.txt文件")
额外说明
- 原代码中同时使用
auth传参和请求头传令牌的写法重复,统一用请求头携带令牌即可,不需要填写用户名 - 原代码中请求
https://api.github.com/user的逻辑仅用于验证令牌有效性,不需要的话可以直接删除 - 如果需要突破1000条结果的限制,可以把搜索条件拆分为多个小范围查询,比如把
q=language:javascript拆成按star数分段:q=language:javascript stars:0..100、q=language:javascript stars:101..500等,每个分段查询单独拉取分页结果,最后合并去重即可
内容的提问来源于stack exchange,提问作者Emily
相关产品推荐
相关产品推荐

