如何限制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
相关产品推荐
相关产品推荐

