使用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
相关产品推荐
相关产品推荐

