如何解决CoinGecko API分页限制,获取全量加密货币列表?
解决方案
这类无总页数返回的分页接口拉取全量数据是非常常见的场景,有通用的实现方案,完全可以通过循环递增page参数的方式实现需求。
核心实现逻辑
- 优先把接口允许的
per_page参数设为最大值,CoinGecko的/coins/markets接口公开版per_page最大支持250,设为最大值可以大幅减少请求次数,降低触发接口限流的概率。 - 从
page=1开始循环发起请求,每次请求后对返回结果做判断:如果返回的币种列表为空,或者列表长度小于你设置的per_page值,就说明已经拉取到最后一页,直接终止循环即可。 - 必须加限流和异常处理逻辑,公开接口普遍有请求频率限制,CoinGecko免费版接口限制为每分钟1030次请求,每次请求后可加12秒的等待延迟,遇到429限流错误时可以延长等待时间后重试。
参考实现代码
import requests import time base_url = "https://api.coingecko.com/api/v3/coins/markets" params = { "vs_currency": "eur", "order": "market_cap_desc", "per_page": 250, "page": 1, "sparkline": "false" } all_coins = [] while True: response = requests.get(base_url, params=params) # 非2xx状态码直接抛出异常,可根据需要补充对应状态码的处理逻辑 response.raise_for_status() current_page = response.json() if not current_page: break all_coins.extend(current_page) # 返回长度小于per_page说明已经到最后一页 if len(current_page) < params["per_page"]: break params["page"] += 1 # 加延迟避免触发限流 time.sleep(1.5) # 所有币种数据存在all_coins变量中 print(f"共获取到{len(all_coins)}条币种数据")
注意事项
- 免费版CoinGecko API全量拉取数据容易触发限流,非必要不要高频执行全量拉取操作,建议对拉取到的结果做缓存,减少重复请求。
- 可以根据实际请求返回的限流提示调整延迟时长,遇到429错误时可增加重试等待时间。
内容的提问来源于stack exchange,提问作者Nauris
相关产品推荐
相关产品推荐

