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

如何遍历Pandas DataFrame每行批量调用API获取合约部署者信息

批量查询智能合约创建者地址的最优实现

针对1000条量级的CSV合约地址查询需求,核心要兼顾运行稳定性、异常容错、避免触发API限流,不建议直接裸写无处理的循环请求,最优实现逻辑如下:

  • 提前抽离公共请求配置(请求头、API基础路径),避免循环内重复定义冗余参数
  • 封装独立的单地址查询方法,内置超时、异常捕获逻辑,单条地址查询失败不会中断整个批量任务
  • 遍历查询时增加轻量延时、失败重试机制,避免触发接口限流规则
  • 查询结果直接写回原DataFrame对应列,方便后续直接导出留存

完整实现代码

import pandas as pd
import requests
import time
import random
# Python3.10以下版本放开下面这行导入,替换返回值类型标注
# from typing import Optional

# -------------------------- 配置项 --------------------------
API_BASE = "https://contract-api.dev/contracts/"
REQ_HEADERS = {
    'CF-Access-Client-Id':  'xxxxxx.access',
    'CF-Access-Client-Secret': 'xxxxx'
}
REQ_TIMEOUT = 10  # 单条请求超时时间,单位秒
RETRY_TIMES = 2   # 单条请求失败重试次数
REQ_DELAY = (0.2, 0.8)  # 每次请求间隔随机延时范围,单位秒,防限流
# -----------------------------------------------------------

def get_creator(contract_address: str):
# Python3.10以下版本用下面这行函数定义
# def get_creator(contract_address: str) -> Optional[str]:
    """单条合约地址查询创建者,带重试和异常捕获"""
    for _ in range(RETRY_TIMES + 1):
        try:
            resp = requests.get(
                f"{API_BASE}{contract_address}",
                headers=REQ_HEADERS,
                timeout=REQ_TIMEOUT
            )
            resp.raise_for_status() # 自动抛出4xx/5xx状态码错误
            data = resp.json()
            return data['deployment']['created_by_user']
        except Exception as e:
            print(f"地址{contract_address}查询失败,错误信息:{str(e)},准备重试...")
            time.sleep(random.uniform(*REQ_DELAY))
    print(f"地址{contract_address}重试{RETRY_TIMES}次后仍查询失败")
    return None

if __name__ == "__main__":
    # 读取本地存储合约地址的CSV文件
    df = pd.read_csv("你的合约地址文件路径.csv")
    # 逐行查询,结果写入新列
    df['created_by_user'] = df['Address'].apply(get_creator)
    # 最终结果保存回CSV
    df.to_csv("带创建者信息的合约地址结果.csv", index=False, encoding='utf-8-sig')

方案说明

  1. 选择pandas.Series.apply而非手动遍历iterrows:apply针对列操作做了底层优化,比手写逐行索引循环的执行效率更高,代码可读性也更好,1000条数据的遍历开销可以忽略不计
  2. 默认采用串行查询而非高并发:1000条请求哪怕加上随机延时,总耗时也在10分钟以内,盲目开多线程/协程高并发很容易触发Cloudflare访问拦截、API限流规则,反而会大幅提升请求失败率
  3. 异常处理覆盖网络超时、接口返回错误、字段缺失三类最常见的失败场景,失败条目会在结果列标记为None,后续可以单独筛出失败条目补查,不会因为单条坏数据中断整个任务
  4. 随机延时用于模拟真实访问的请求间隔,避免被CF风控识别为恶意爬虫拦截

如果确认目标API没有限流规则、允许高并发访问,可以替换为aiohttp+asyncio的异步请求实现,1000条请求总耗时可以压缩到1分钟以内,但非必要不优先使用,稳定跑通任务优先级最高。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:51:20