第二章:数据获取工具——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个区块 全历史数据
我的建议:学习阶段用Infura就够了。做生产级应用,特别是需要历史数据回溯时,Alchemy是更好的选择。

2.2 Etherscan API 申请与调用

Etherscan不只是区块链浏览器,它提供的API是链上数据挖掘的宝库。你可以直接拿到合约ABI、交易历史、代币持有者列表等数据。

申请流程很简单:

  1. 去Etherscan官网注册账号
  2. 进入「API Keys」页面
  3. 创建一个新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']}")
注意:Etherscan免费版API有速率限制,每秒最多5次请求。我建议在循环里加个time.sleep(0.2),避免被限流。

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("---")
避坑指南:我曾经在批量获取历史区块时,没有设置超时参数,结果程序卡住了整整两个小时。建议加上timeout参数:w3.eth.get_block(block_number, timeout=30)

2.4 本章知识体系

下面这张图,帮你理清数据获取的整体流程:

链上数据获取流程 以太坊节点 Etherscan 其他数据源 Infura / Alchemy Etherscan API 自定义爬虫 Web3.py 数据解析 结构化数据(CSV / JSON / 数据库)

从这张图你能看到,数据获取不是单一路径。节点服务商提供原始区块数据,Etherscan提供聚合好的交易记录,而Web3.py就是那个把原始数据变成结构化数据的转换器。

我的工作流:先用Etherscan API快速了解数据分布,再用Web3.py通过Infura拉取原始区块数据做深度分析。两者配合,效率最高。

好了,这一章的内容就到这里。工具都准备好了,下一章我们就要真正开始动手挖数据了。


蓝海数据掘金营,专注资料整理