如何获取以太坊代币持有者数量历史数据并开展每日分析及可视化图表制作
解决以太坊代币持有者历史数据获取与分析的方案
我之前做代币数据分析的时候也碰到过一模一样的问题——Etherscan只给实时数据,根本拿不到历史记录,后来摸索出几个可行的路子,分享给你:
一、自建定时采集系统(最灵活可控)
这是我最常用的方法,本质就是每天定时抓取Etherscan的实时持有者数据,存到自己的数据库里,攒一段时间就有完整的历史数据了。
- 技术实现思路:
- 用Python写个简单的脚本,调用Etherscan的
token/tokenHolderAPI接口(记得申请API Key,免费额度足够个人用) - 用
schedule库或者云厂商的定时触发函数(比如AWS Lambda、阿里云函数计算)设置每天固定时间执行脚本 - 把获取到的日期、持有者数量存到SQLite/PostgreSQL这类数据库里
- 用Python写个简单的脚本,调用Etherscan的
举个极简的代码片段:
import requests import sqlite3 from datetime import date ETHERSCAN_API_KEY = "你的API密钥" TOKEN_ADDRESS = "目标代币合约地址" def fetch_and_save_holders(): url = f"https://api.etherscan.io/api?module=token&action=tokenholderlist&contractaddress={TOKEN_ADDRESS}&page=1&offset=1&apikey={ETHERSCAN_API_KEY}" response = requests.get(url).json() total_holders = response['result'][0]['TokenHolderCount'] today = date.today().isoformat() conn = sqlite3.connect('token_holders.db') cursor = conn.cursor() cursor.execute("CREATE TABLE IF NOT EXISTS holders (date TEXT PRIMARY KEY, count INTEGER)") cursor.execute("INSERT OR REPLACE INTO holders VALUES (?, ?)", (today, total_holders)) conn.commit() conn.close() # 可以用schedule每天凌晨执行 # schedule.every().day.at("00:00").do(fetch_and_save_holders)
二、借助第三方数据平台(最快上手)
如果不想自己写代码,直接用现成的第三方数据平台就行,很多平台已经帮你攒好了历史数据:
- Dune Analytics:上面有很多社区共享的代币持有者历史查询面板,能直接看趋势,还能导出CSV格式的数据自己做分析
- Nansen:侧重链上行为分析,免费版就能查看不少代币的持有者历史变化,还自带可视化图表
- 部分区块链浏览器的进阶版:有些浏览器除了实时数据,还提供历史数据查询功能,不过需要留意是否付费
三、直接解析链上数据(最精准,技术门槛高)
如果追求100%精准的数据,而且有开发能力,可以直接从以太坊链上抓取:
- 同步以太坊全节点,或者用Infura/Alchemy这类节点服务
- 调用代币合约的
balanceOf方法遍历所有有余额的地址,统计持有者数量 - 可以用BigQuery这类大数据工具来批量处理链上数据,效率更高
四、图表制作方案
有了历史数据之后,制作趋势图就很简单了:
- 用Python的
matplotlib/seaborn:代码就能生成自定义的折线图,比如:
import matplotlib.pyplot as plt import sqlite3 conn = sqlite3.connect('token_holders.db') cursor = conn.cursor() cursor.execute("SELECT date, count FROM holders ORDER BY date") data = cursor.fetchall() conn.close() dates = [row[0] for row in data] holder_counts = [row[1] for row in data] plt.figure(figsize=(12, 6)) plt.plot(dates, holder_counts, marker='o', linestyle='-') plt.xlabel('日期') plt.ylabel('持有者数量') plt.title('代币持有者数量历史趋势') plt.xticks(rotation=45) plt.tight_layout() plt.show()
- 用Excel/Tableau:导入CSV数据后,直接插入折线图,拖拽字段就能生成可视化图表,适合非开发人员
内容的提问来源于stack exchange,提问作者Moon soon




