第二章:数据获取工具——Infura与Alchemy节点服务、Etherscan API申请与调用、Web3.py基础用法
做链上数据挖掘,第一步就是搞定数据来源。你想想看,没有数据,再牛的分析模型也是空中楼阁。这一章,我就带你亲手搭建数据管道,把区块链上的原始数据拉到你的分析环境里。
2.1 节点服务商:Infura vs Alchemy
自己跑一个以太坊全节点?说实话,不推荐。数据同步要几天,硬盘要几个T,带宽还要稳定。我早期踩过这个坑,后来果断换了节点服务商。
Infura 是老牌选手,2016年就出来了。免费版每天10万次请求,对学习和原型验证完全够用。我个人习惯用Infura做快速测试,因为它API结构简单,文档也清晰。
Alchemy 是后起之秀,功能更丰富。它提供了增强版的API,比如可以一次查询多个区块的交易,还能拿到交易的回执状态。我在做DeFi清算监控项目时,Alchemy的WebSocket推送帮了大忙。
| 对比项 | Infura | Alchemy |
|---|---|---|
| 免费额度 | 10万次/天 | 3亿次/月(约1000万次/天) |
| 增强API | 基础JSON-RPC | 交易回执、NFT API、Token API |
| WebSocket | 支持 | 支持,且更稳定 |
| 历史数据 | 最近128个区块 | 全历史数据 |
2.2 Etherscan API 申请与调用
Etherscan不只是区块链浏览器,它提供的API是链上数据挖掘的宝库。你可以直接拿到合约ABI、交易历史、代币持有者列表等数据。
申请流程很简单:
- 去Etherscan官网注册账号
- 进入「API Keys」页面
- 创建一个新API Key,复制保存
我曾经在做一个地址标签项目时,需要批量查询几千个地址的交易记录。用Etherscan API配合异步请求,几分钟就搞定了。如果自己解析区块,至少得跑几个小时。
下面是一个Python调用示例:
import requests
API_KEY = "你的API_KEY"
address = "0x...目标地址"
# 获取普通交易记录
url = f"https://api.etherscan.io/api?module=account&action=txlist&address={address}&startblock=0&endblock=99999999&sort=asc&apikey={API_KEY}"
response = requests.get(url)
data = response.json()
if data['status'] == '1':
for tx in data['result'][:5]: # 只打印前5条
print(f"交易哈希: {tx['hash']}")
print(f"区块号: {tx['blockNumber']}")
print(f"金额(ETH): {int(tx['value']) / 1e18}")
print("---")
else:
print(f"请求失败: {data['message']}")
2.3 Web3.py 基础用法
Web3.py是Python生态里最流行的以太坊交互库。说白了,它就是帮你把JSON-RPC请求封装成了Python函数,让你用起来更顺手。
安装和连接:
pip install web3
from web3 import Web3
# 连接Infura节点
infura_url = "https://mainnet.infura.io/v3/你的PROJECT_ID"
w3 = Web3(Web3.HTTPProvider(infura_url))
# 检查连接状态
if w3.is_connected():
print("连接成功!")
print(f"当前区块高度: {w3.eth.block_number}")
else:
print("连接失败,检查网络或API Key")
嗯,这里要注意:连接成功后,你就能用w3对象做各种操作了。我个人最常用的几个功能:
- 查询余额:
w3.eth.get_balance('0x地址') - 获取交易:
w3.eth.get_transaction('0x交易哈希') - 调用合约:先加载ABI,再用
contract.functions.方法名().call()
为什么会这样设计?因为Web3.py把以太坊的JSON-RPC接口映射成了Python对象,你不需要手动拼接请求体,也不用解析返回的十六进制数据。
实战:获取最新区块的交易数据
latest_block = w3.eth.get_block('latest', full_transactions=True)
print(f"区块号: {latest_block['number']}")
print(f"交易数量: {len(latest_block['transactions'])}")
for tx in latest_block['transactions'][:3]:
print(f"发送方: {tx['from']}")
print(f"接收方: {tx['to']}")
print(f"Gas价格: {tx['gasPrice']} wei")
print("---")
w3.eth.get_block(block_number, timeout=30)
2.4 本章知识体系
下面这张图,帮你理清数据获取的整体流程:
从这张图你能看到,数据获取不是单一路径。节点服务商提供原始区块数据,Etherscan提供聚合好的交易记录,而Web3.py就是那个把原始数据变成结构化数据的转换器。
好了,这一章的内容就到这里。工具都准备好了,下一章我们就要真正开始动手挖数据了。