You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何限制API请求返回条目为10?循环调用API显示最新10条结果

解决方案建议

1. 优先通过API参数限制返回条数(推荐)

先确认你调用的API文档,多数区块链日志类API(比如Etherscan的getLogs)支持直接通过参数限制返回结果数量,常见参数如offset或limit。如果支持,直接在请求参数中添加:

params={
    "module": "logs",
    "action": "getLogs",
    "address": contract_address,
    "startblock": "-10000",
    "endblock": "latest",
    "apikey": api_key,
    "offset": 10  # 限制返回10条结果
}

这种方式能让API直接返回指定数量的数据,既减少传输量,也能降低触发速率限制的概率。

2. 本地处理结果,提取最新10条

如果API不支持返回条数限制,就对返回的transactions列表做切片处理。注意先确认API结果的排序逻辑:

  • 若结果按区块号从旧到新排序(多数API默认规则),最新的10条在列表末尾,用切片transactions[-10:]
  • 若结果按区块号从新到旧排序,最新的10条在列表开头,用切片transactions[:10]

修改后的代码示例:

import requests
import time

def searchLoop(contract_address):
    while True:
        response = requests.get(api_url, params={
            "module": "logs",
            "action": "getLogs",
            "address": contract_address,
            "startblock": "-10000",
            "endblock": "latest",
            "apikey": api_key
        })
        transactions = response.json()["result"]
        
        # 提取最新10条,兼容结果不足10条的情况
        latest_10_transactions = transactions[-10:] if len(transactions) >= 10 else transactions
        print(latest_10_transactions)
        
        time.sleep(5)

3. 优化请求范围,减少重复数据(进一步降低速率限制风险)

每次固定请求最近10000个区块,容易重复获取已处理过的旧数据,还会返回过多结果。可以记录上次处理的最新区块号,下次请求时从该区块之后开始:

import requests
import time

def searchLoop(contract_address):
    last_processed_block = 0  # 初始化上次处理的区块号
    while True:
        # 从上次处理的区块+1开始请求,避免重复获取旧数据
        startblock = last_processed_block + 1 if last_processed_block != 0 else "-10000"
        response = requests.get(api_url, params={
            "module": "logs",
            "action": "getLogs",
            "address": contract_address,
            "startblock": startblock,
            "endblock": "latest",
            "apikey": api_key
        })
        transactions = response.json()["result"]
        
        if transactions:
            # 提取最新10条
            latest_10 = transactions[-10:] if len(transactions) >= 10 else transactions
            print(latest_10)
            # 更新上次处理的区块号为最新交易的区块号(注意区块号是十六进制,需转十进制)
            last_processed_block = max(int(tx["blockNumber"], 16) for tx in transactions)
        
        time.sleep(5)

这种方式每次只请求新增的日志,返回结果数量会大幅减少,从根本上降低触发速率限制的可能。

内容的提问来源于stack exchange,提问作者Tom154ce

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:15:36