数据源准备: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错误,排查了半天才发现是限流了。
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()
二、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)来控制频率。
三、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")
四、知识体系总览
为了让你更直观地理解这三者的关系,我画了一张图:
这张图很直观: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把它们串起来。这三样东西配齐了,你就能开始追踪聪明钱了。
下一章,我们会用这些工具,写一个脚本去抓取某个地址的交易记录。准备好了吗?