数据源准备:Etherscan API申请、Infura节点配置、Web3.py环境搭建

做链上数据分析,说白了就是跟数据源打交道。没有数据源,你连链上发生了什么都不知道,更别提追踪聪明钱了。

我个人习惯把数据源分成两类:一类是区块数据,比如交易记录、合约调用;另一类是元数据,比如合约ABI、交易标签。前者靠节点,后者靠浏览器API。今天我们就一步步搞定这两样东西。

一、Etherscan API 申请

Etherscan 是什么?它是以太坊上最常用的区块浏览器。你查一笔交易、看一个地址的余额,背后都是Etherscan在提供服务。但手动点网页太慢了,我们要用API来批量拉数据。

1.1 注册并创建API Key

etherscan.io/register 注册一个账号。注册完登录,点右上角头像 → "API Keys" → "Add"。

创建时选 "Developer (Free)" 就行。免费版每秒5次请求,一天最多10万次。嗯,这里要注意:如果你跑高频策略,这个限制会卡脖子。我刚开始做的时候没注意,脚本跑着跑着突然报429错误,排查了半天才发现是限流了。

小技巧: 免费版够用吗?对于个人学习和中小规模分析,完全够。但如果你要扫几千个地址的历史交易,建议升级到Pro版(每秒30次请求)。

1.2 API Key 的存储

千万别把API Key硬编码在代码里。我见过有人把Key直接贴到GitHub上,结果被机器人扫到,一天之内被刷爆了额度。

我的做法是用环境变量:

# 在 .env 文件中
ETHERSCAN_API_KEY=你的API_KEY

# 在Python中加载
from dotenv import load_dotenv
import os

load_dotenv()
api_key = os.getenv("ETHERSCAN_API_KEY")

1.3 常用API端点

Etherscan的API分好几类,我们最常用的是这几个:

端点 功能 示例
account/txlist 获取地址的普通交易 查某个地址的转账记录
account/txlistinternal 获取内部交易 查合约之间的调用
contract/getabi 获取合约ABI 解析合约方法名
stats/ethprice 获取ETH价格 计算交易时的美元价值

举个例子,查一个地址最近100笔交易:

import requests

url = f"https://api.etherscan.io/api"
params = {
    "module": "account",
    "action": "txlist",
    "address": "0x你的目标地址",
    "startblock": 0,
    "endblock": 99999999,
    "sort": "desc",
    "apikey": api_key
}
response = requests.get(url, params=params)
data = response.json()
注意: Etherscan返回的数据里,value字段的单位是wei,需要除以10^18才是ETH。我曾经踩过这个坑,算出来的金额大了18个数量级,差点以为自己发现了鲸鱼地址。

二、Infura 节点配置

Etherscan能查历史数据,但实时数据呢?比如监听新交易、查当前区块状态,这些得靠节点。自己跑一个全节点?太费硬盘了,光以太坊主网就1TB+。所以,我们用Infura这样的节点服务商。

2.1 注册Infura并创建项目

infura.io/register 注册。登录后点 "Create New API Key",选 "Web3 API"。

创建完你会得到一个URL,长这样:

https://mainnet.infura.io/v3/你的PROJECT_ID

这个PROJECT_ID就是你的身份凭证。同样,别硬编码,放环境变量里。

2.2 选择网络端点

Infura支持多个网络,我们最常用的是:

  • mainnet:以太坊主网
  • goerli:测试网(快被淘汰了,建议用Sepolia)
  • sepolia:新的测试网

我个人建议:调试代码时用Sepolia测试网,跑正式分析时切到mainnet。测试网的ETH可以从水龙头免费领,别傻乎乎用主网ETH测试。

2.3 限流与费用

Infura免费版每天10万次请求,每秒最多100次。听起来很多?但如果你跑一个循环查每个区块的交易,几分钟就没了。

我曾经有一次写了个脚本,没加延迟,5分钟就把一天的额度跑完了。后来学乖了,加了个time.sleep(0.1)来控制频率。

升级建议: 如果免费额度不够,可以升级到Infura的Growth计划(每月50美元),或者用Alchemy(另一个节点服务商,免费版额度更高)。

三、Web3.py 环境搭建

有了数据源,怎么在Python里用?Web3.py就是那个桥梁。它让你用Python代码跟以太坊节点交互,查余额、发交易、监听事件,都能搞定。

3.1 安装Web3.py

用pip安装:

pip install web3

建议在虚拟环境里装。我习惯用venv:

python -m venv web3_env
source web3_env/bin/activate  # Mac/Linux
web3_env\Scripts\activate     # Windows
pip install web3 python-dotenv requests

3.2 连接Infura节点

装好之后,写几行代码测试连接:

from web3 import Web3
import os
from dotenv import load_dotenv

load_dotenv()

infura_url = f"https://mainnet.infura.io/v3/{os.getenv('INFURA_PROJECT_ID')}"
w3 = Web3(Web3.HTTPProvider(infura_url))

# 检查是否连接成功
if w3.is_connected():
    print(f"连接成功!当前区块高度:{w3.eth.block_number}")
else:
    print("连接失败,检查你的PROJECT_ID")

如果输出 "连接成功",恭喜你,环境搭好了。

3.3 常用操作示例

连接成功后,你可以做很多事。比如查一个地址的ETH余额:

address = "0x你的目标地址"
balance_wei = w3.eth.get_balance(address)
balance_eth = w3.from_wei(balance_wei, 'ether')
print(f"余额:{balance_eth} ETH")

或者查一笔交易的详情:

tx_hash = "0x交易哈希"
tx = w3.eth.get_transaction(tx_hash)
print(f"发送方:{tx['from']}")
print(f"接收方:{tx['to']}")
print(f"金额:{w3.from_wei(tx['value'], 'ether')} ETH")
注意: Web3.py默认返回的数据单位是wei。做计算时一定要记得转换,不然数字会大得离谱。我刚开始用的时候,打印出来的余额是10^18量级,还以为自己查到了巨鲸。

四、知识体系总览

为了让你更直观地理解这三者的关系,我画了一张图:

链上数据源架构图 Etherscan API 历史交易数据 合约ABI 地址标签 Infura 节点 实时区块数据 交易广播 状态查询 Web3.py Python接口 数据解析 自动化脚本 HTTP请求 JSON-RPC 你的Python脚本 Etherscan提供历史数据,Infura提供实时数据,Web3.py把它们整合到Python中

这张图很直观:Etherscan管历史,Infura管实时,Web3.py管整合。三者配合,你就能拿到链上所有需要的数据。

五、避坑指南

最后,分享几个我踩过的坑:

  • API Key泄露:别把Key提交到GitHub。我有个朋友把Key写在代码里,结果被机器人扫到,一天被刷了10万次请求,直接封号。
  • 单位转换:Web3.py和Etherscan返回的金额都是wei。记得除以10^18。我刚开始做的时候,算出来的金额大了18个数量级,差点以为自己发现了鲸鱼地址。
  • 限流处理:免费API都有频率限制。加个time.sleep(0.2)或者用retry库,能避免被限流。
  • 测试网与主网:调试代码用Sepolia测试网,别在主网上试。测试网的ETH免费,主网ETH可是真金白银。

总结一下:

Etherscan API搞定历史数据,Infura节点搞定实时数据,Web3.py把它们串起来。这三样东西配齐了,你就能开始追踪聪明钱了。

下一章,我们会用这些工具,写一个脚本去抓取某个地址的交易记录。准备好了吗?

专注资料整理