API 循环,用下一个游标更新 GET 请求

API loop, update GET request with next cursor

我有一个执行 GET 请求然后打印结果数据的工作循环。我现在需要的是创建另一个循环,将光标附加到第二个和以后的请求的末尾,以便每个请求都可以提取新数据。因此,URL+cursor 循环将包含我的工作数据打印循环。

我是 API 的新手,但根据我收集到的信息,请求生成一个游标,然后您使用该游标来查找下一批数据,然后该批次拥有下一批次的游标,直到那里没有更多的批次,光标是空白的。

我可以获得第一个批次和第一个游标,但我在使用该游标查找下一批次时遇到问题。有什么建议吗?

PS - 这个例子只循环了 5 次,但最终我会让它循环直到光标为空并将所有数据打印到 CSV。

import requests
import time
cursor=""

for i in range(5):
# api-endpoint
    URL = "https://api.x.immutable.com/v1/orders?status=filled&sell_token_address=0xac98d8d1bb27a94e79fbf49198210240688bb1ed&cursor="

# sending get request and saving the response as response object
    r = requests.get(url = URL + cursor)

# extracting data in json format
    data = r.json()

    for index, items in enumerate(data["result"]):
        orderID = data["result"][index]['order_id']
        info = data["result"][index]["sell"]["data"]["properties"]["name"]
        price = data["result"][index]["buy"]["data"]["quantity"]
        decimals = data["result"][index]["buy"]["data"]["decimals"]
        print(index, orderID, info, price, decimals)


    cursor = data["cursor"]
    print("Cursor: ", cursor)
    time.sleep(1) 
    
print("END")

将参数附加到 URL 很少是个好主意。更好的方法是使用字典并将其传递给请求函数。

当您多次调用同一个 URL(尽管使用不同的参数)时,可以通过使用会话对象来提高性能。

这应该让您了解如何构建此代码:

import requests
from requests.adapters import HTTPAdapter, Retry


URL = "https://api.x.immutable.com/v1/orders"

params = {'status': 'filled',
          'sell_token_address': '0xac98d8d1bb27a94e79fbf49198210240688bb1ed'}

with requests.Session() as session:
    retry = Retry(
        total=5,
        status_forcelist=[500, 502, 503, 504],
        backoff_factor=0.1
    )
    session.mount(URL, HTTPAdapter(max_retries=retry))
    while True:
        (r := session.get(URL, params=params)).raise_for_status()
        data = r.json()
        for value in data['result']:
            orderID = value['order_id']
            info = value["sell"]["data"]["properties"]["name"]
            price = value["buy"]["data"]["quantity"]
            decimals = value["buy"]["data"]["decimals"]
            print(f'Order ID={orderID}, Info={info}, Price={price}, Decimals={decimals}')
        if (cursor := data.get('cursor')):
            params['cursor'] = cursor
        else:
            break

print("END")

注:

Python 此语法需要 3.8+