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

使用Python循环调用API请求变量遇超时及变量识别问题求助

解决你的API调用超时和变量识别问题

先揪出你代码里最显眼的问题——API请求URL的参数拼接错误,这直接导致address变量无法被正确识别,甚至引发请求异常超时:

在你的请求URL里,address="+address+"=5585000这里漏掉了&startblock=参数名,正确的拼接应该是&startblock=5585000。原URL里address后面直接跟=5585000,API根本不知道这是startblock参数,自然会错误解析address的值,甚至返回无效请求,进而导致超时。

接下来整理修复后的完整代码,同时解决其他潜在问题:

修复后的完整代码

import requests
import pandas as pd
import time
import os

# 把地址列表移到循环外,避免重复定义
addresses = ["0xe3457148b4f535b7a42bf6aaa06c6c92a0b9f9cb", "0xad8f33994ec88ab208ada1d286b41c4a39515aed"]
# 定义API基础配置,避免硬编码拼接出错
API_BASE_URL = "http://api.etherscan.io/api"
base_params = {
    "module": "account",
    "action": "txlist",
    "startblock": 5585000,
    "endblock": 5590000,
    "sort": "asc",
    "apikey": "SZAEWWTN9YXQNR4X593AUDB7Y5323D6CAE"
}

# 打开文件时用newline=''避免空行,同时处理表头逻辑
with open('TransactionHistory.csv', 'a', newline='') as f:
    # 第一次写入时添加表头(如果文件为空)
    if os.stat('TransactionHistory.csv').st_size == 0:
        # 先请求一次获取正确的表头结构
        test_res = requests.get(API_BASE_URL, params={**base_params, "address": addresses[0]}, timeout=10)
        test_json = test_res.json()
        if test_json.get('status') == '1' and test_json.get('result'):
            pd.DataFrame(test_json['result']).to_csv(f, header=True, index=False)
    
    while True:
        for address in addresses:
            try:
                # 动态更新address参数,用params传递避免拼接错误
                req_params = {**base_params, "address": address}
                # 设置超时时间,防止请求卡住
                data_request = requests.get(API_BASE_URL, params=req_params, timeout=10)
                data_request.raise_for_status()  # 主动抛出HTTP错误(比如403、500)
                
                response_json = data_request.json()
                # 检查Etherscan API的返回状态(status=1表示成功)
                if response_json.get('status') != '1':
                    print(f"请求地址{address}失败:{response_json.get('message')}")
                    continue
                
                # 提取实际的交易列表(result字段才是核心数据)
                tx_data = response_json.get('result', [])
                if not tx_data:
                    print(f"地址{address}未找到交易数据")
                    continue
                
                df = pd.DataFrame(tx_data)
                # 追加写入数据,不重复写表头
                df.to_csv(f, header=False, index=False)
                print(f"成功写入地址{address}的交易数据")
                
            except requests.exceptions.RequestException as e:
                print(f"请求地址{address}时出错:{str(e)}")
        
        print("本轮请求完成,等待120秒后继续...")
        time.sleep(120)

关键修复点说明

  • 修复参数拼接错误:用params字典传递参数,彻底避免字符串拼接时的语法失误,代码也更易维护。
  • 添加超时控制:给requests.get加上timeout=10,防止请求长时间卡住导致超时。
  • 正确解析API返回:Etherscan API的result字段才是交易列表,直接把整个JSON转DataFrame会导致结构混乱,必须提取result生成数据框。
  • 完善错误处理:加入try-except捕获请求异常,同时检查API返回的status字段,及时处理请求失败的情况。
  • 避免覆盖内置模块:把原代码里的json = data_request.json()改成response_json,防止覆盖标准库的json模块。
  • 优化文件写入:判断文件是否为空,第一次写入表头,后续只追加数据;用newline=''避免CSV出现空行。

这些修改应该能解决你遇到的address变量识别问题和超时问题,同时让代码更健壮。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:53:54