2. 获取以太坊实时行情

任务目标

通过WebSocket连接加密货币交易所,实时接收以太坊(ETH)的最新成交价与24小时交易量,并持续打印更新。本案例以币安(Binance)公开行情接口为例,无需。

环境依赖

需要Python 3.8+,并安装websockets库:

pip install websockets

关键完整代码

以下代码建立WebSocket连接,订阅ETH/USDT的24小时滚动窗口行情(ticker频道),该频道推送的数据包含最新价格c和24小时成交量v:

import asyncio
import json
import websockets

BINANCE_WS_URL = "wss://stream.binance.com:9443/stream"

async def fetch_eth_ticker():
    # 订阅单个流的参数格式:<streamName>,此处为 ethusdt@ticker
    subscribe_msg = {
        "method": "SUBSCRIBE",
        "params": ["ethusdt@ticker"],
        "id": 1
    }
    async with websockets.connect(BINANCE_WS_URL) as ws:
        await ws.send(json.dumps(subscribe_msg))
        print("已订阅 ethusdt@ticker,等待数据...")
        while True:
            raw = await ws.recv()
            data = json.loads(raw)
            # 过滤掉订阅确认消息(无 'data' 字段)
            if "data" not in data:
                continue
            ticker = data["data"]
            price = float(ticker["c"])       # 最新成交价
            volume = float(ticker["v"])       # 24小时成交量(以ETH计)
            print(f"ETH/USDT 最新价: {price:.2f} | 24h成交量: {volume:.4f} ETH")

if __name__ == "__main__":
    try:
        asyncio.run(fetch_eth_ticker())
    except KeyboardInterrupt:
        print("\n已手动停止")

运行方式

  1. 将上述代码保存为 eth_ws_ticker.py。
  2. 在终端执行:python eth_ws_ticker.py

验证方法

程序启动后,若连接成功,会先打印“已订阅”提示,随后每约1秒输出一行ETH/USDT的最新价格与24小时成交量。判定通过的标准:

  • 终端持续打印价格与成交量数据,且价格数值与主流行情网站(如CoinMarketCap或币安官网)的ETH/USDT价格基本一致(允许微小延迟差异)。
  • 手动按 Ctrl+C 能正常退出程序,无异常堆栈。

常见问题

  • 连接被拒绝或超时:检查网络是否能访问外网,币安WebSocket域名可能需代理;若使用公共网络受限,可尝试更换网络环境。
  • 无数据输出:确认订阅消息中参数为小写交易对 ethusdt@ticker,且未修改id字段。
  • 频繁断线:免费公共接口有连接数限制,若同时运行多个实例可能被断开,关闭其他占用该连接的进程即可。