通过Python requests下载GitHub公开仓库数百个raw文件是否存在限制?
该工作流存在多类限制,具体如下
- API速率限制:GitHub 对未认证的 REST API 请求限制为每小时 60 次,你当前的代码没有带身份认证信息,如果请求频次稍高(比如多用户共用、单次拉取多个仓库)会很快触发限流,返回403错误。如果走认证模式(请求头携带个人访问令牌),单用户每小时可请求5000次,能大幅提升阈值;如果是多用户共用同一个服务IP请求,就算走认证,也可能触发IP维度的临时限流。
- contents接口条目上限与分页限制:你调用的
/repos/{owner}/{repo}/contents接口默认每页仅返回30个条目,可通过per_page参数调整到最大100条/页,最多仅返回1000个文件/目录条目,刚好匹配你提到的最多1000个文件的使用上限,你需要额外处理分页逻辑才能拿到完整的1000条数据;若后续目录内文件超过1000,该接口将无法返回完整列表,需要改用Git Tree接口拉取全量条目。 - raw资源访问限制:批量高频拉取raw文件会触发GitHub的反爬机制,同样会返回限流错误,且你当前代码拉取raw时没有设置超时,遇到网络波动会直接卡住。
- 异常场景无兼容:当前代码没有做任何异常处理:如果API请求失败(404/403/500等状态码),直接调用
r.json()会抛出异常;如果目录内存在子目录,子目录条目没有download_url字段,遍历取值会直接报错;如果仓库对应路径的文件是LFS存储的资源,拿到的download_url下载到的会是LFS元数据而非真实文件内容。
代码优化建议
可以针对上述问题调整代码,参考示例如下:
import requests import urllib.request # 可选:添加GitHub个人访问令牌提升限流阈值 headers = { "Authorization": "token 你的个人访问令牌", "Accept": "application/vnd.github.v3+json" } # 增加per_page参数调整单页返回数量,后续可根据响应头的Link字段处理分页 url = f'https://api.github.com/repos/{owner}/{repo}/contents/Scenes?ref=main&per_page=100' # 加超时和请求头 r = requests.get(url, headers=headers, timeout=10) # 先判断请求是否成功 if r.status_code != 200: # 自行处理错误逻辑,比如抛异常、重试 raise Exception(f"接口请求失败,状态码:{r.status_code}") for item in r.json(): # 过滤掉子目录,只处理文件 if item['type'] != 'file': continue raw_url = item['download_url'] # 用with语法自动释放连接,加超时参数 with urllib.request.urlopen(raw_url, timeout=10) as f: code = f.read() # 后续文件处理逻辑
内容的提问来源于stack exchange,提问作者andr
相关产品推荐
相关产品推荐

