API 请求一次调用所有页面?

API request with all pages in one call?

我正在请求硬币列表

requests.get(
"https://api.coingecko.com/api/v3/coins/markets?vs_currency=eur&order=market_cap_desc&per_page=4&page=1&sparkline=false").text

问题是有一个名为“per_page”的参数有限制。因此,为了通过一个请求获得所有硬币,我需要将“页面”参数增加 1。而且也不知道有多少页。 这种情况有解决办法吗?也许是一个增加价值的循环?

看URL好像最多250个硬币,增加per_page=参数:

import requests

url = "https://api.coingecko.com/api/v3/coins/markets?vs_currency=eur&order=market_cap_desc&per_page=999&page=1&sparkline=false"

data = requests.get(url).json()

for i, d in enumerate(data, 1):
    print("{:>3}. {}".format(i, d["name"]))

打印:


...

237. Kadena
238. Ark
239. AllianceBlock
240. Adventure Gold
241. Sapphire
242. cUNI
243. Balancer
244. FLEX Coin
245. Casper Network
246. DerivaDAO
247. Unizen
248. IDEX
249. Enzyme
250. sBTC

编辑:加载多个页面:

import json
import requests

url = "https://api.coingecko.com/api/v3/coins/markets?vs_currency=eur&order=market_cap_desc&per_page=4&page={}&sparkline=false"


cnt, i = 1, 1
while True:
    try:
        data = requests.get(url.format(i)).text
        data = json.loads(data)
    except:
        print("Error!")
        break

    if not data:
        break

    for d in data:
        print("{:>3}. {}".format(cnt, d["name"]))
        cnt += 1
    i += 1

如果请求的硬币数量有上限,并且 API 允许您超过它,那么这就是解决方案。但是那样的话你就不会在这里了,所以可以安全地假设情况更糟。

让我们取一个看似很大的数字,比如 1000(或您选择的值)。执行以下算法:

offset <- 0
limit <- 1000
do
    items <- request(offset, offset + limit)
    offset <- offset + limit
    doSomethingWith(items)
while not items.empty
processResults()