用Python实战:零门槛批量获取欧易现货全文数字货币行情

·

本文将带你用Python网络爬虫+MySQL实时存储+钉钉告警三件套,在本地MySQL数据库里搭建一套可无限扩展的虚拟货币价格监控系统,覆盖BTC、ETH、SOL等当前主流币种。整个流程不依赖付费接口,全部基于欧易公开行情页面完成。


一、准备环境:三个依赖一次装完

核心依赖仅三项,无需额外注册或 API Key。

pip install selenium dingtalkchatbot mysql-connector-python
作用包名说明
抓取页面selenium动态渲染网页,避开简单反爬
数据入库mysql-connector-python官方MySQL驱动,兼容几乎所有云数据库
实时通知dingtalkchatbot免费把行情异动推送到钉钉群
macOS 需额外 brew install chromedriver;Windows 直接下载对应版本驱动丢到 PATH 即可。

二、代码拆解:10 分钟复制粘贴即可跑通

2.1 启动浏览器并导航到现货列表页

from selenium import webdriver

browser = webdriver.Chrome()
# 请替换为最新可用域名 ↓
browser.get("https://www.okx.com/join/8265080markets/spot-list")

配置完成后,浏览器会自动打开欧易现货页。下一步把页面源代码(含实时行情)抓下来。


2.2 提取币种名称与最新价

import re

html = browser.page_source

# 正则精准“抠”出币种名称与价格
name_pattern = r'<div class="name">(.*?)/USDT</div>'
price_pattern = r'<div class="last">\$([\d,.]+)</div>'

coin_names = re.findall(name_pattern, html)
usdt_prices = re.findall(price_pattern, html)

# 转成浮点数,方便后续计算
prices = [float(p.replace(',', '')) for p in usdt_prices]

两个列表此刻已完成 “币种—价格”一一映射,为下一步落库提供标准数据。


2.3 建立MySQL表并动态扩列

我的技巧:按需建表+动态加列,这样新增币种时无须手动改表结构。

import mysql.connector

conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='你的密码',
    database='crypto'
)
cursor = conn.cursor()

# 如果 crypto 表不存在,先建主键
cursor.execute("CREATE TABLE IF NOT EXISTS crypto (id INT AUTO_INCREMENT PRIMARY KEY)")

for coin in coin_names:
    safe_col = coin.replace('/', '')  # BTC/USDT -> BTCUSDT
    try:
        cursor.execute(f"ALTER TABLE crypto ADD COLUMN {safe_col} FLOAT")
    except mysql.connector.errors.ProgrammingError:
        pass  # 币种已存在,跳过

conn.commit()

2.4 批量写库,你的行情小金库初见雏形

cols = ",".join(c.replace('/', '') for c in coin_names)
placeholders = ",".join(['%s'] * len(coin_names))
sql = f"INSERT INTO crypto ({cols}) VALUES ({placeholders})"

cursor.execute(sql, prices)
conn.commit()

运行后,你将拥有一张持续追加记录的历史价格宽表,每行对应当前时间点的全币种快照。


三、5 行代码加钉钉实时告警

from dingtalkchatbot.chatbot import DingtalkChatbot

webhook = "https://oapi.dingtalk.com/robot/send?access_token=你的token"
xiaoding = DingtalkChatbot(webhook)

btc = prices[coin_names.index("BTC")]
if btc > 45000 or btc < 42000:
    xiaoding.send_text(f"❗比特币现报 {btc} USDT,触发阈警!")

勾选“关键词匹配”后可确保钉钉群内第一时间收到提醒,完全免费、无速率门槛。


四、进阶:循环轮询+异常兜底完整脚本

整合成 while True 循环,可长期后台运行:

import time

a, b = 45000, 42000  # 自定义上下阈值
while True:
    try:
        browser.refresh()
        time.sleep(10)  # 每 10 秒刷一次
        html = browser.page_source
        # …抽取及入库同上…
    except Exception as e:
        xiaoding.send_text("❌爬虫异常:{}".format(str(e)[:50]))
    time.sleep(50)
本地跑久了最好搭配 nohuppm2,防止 SSH 掉线进程终止。

五、避坑锦囊:三项易被忽略的细节

  1. 币种同步延迟
    欧易偶尔隐藏小流动性币种。正则没匹配到新币时不要慌,重跑一次即可。
  2. 价格千位分隔符
    必须 replace(',', '')float(),否则 ValueError 血亏。
  3. 数据库大量空白值
    如果脚本中断,重启时有概率缺某一币种。可以加默认值 NULL并批量 UPDATE 补位。

常见问题 FAQ

Q1:这样做是否违反欧易使用条款?
不会。抓取的是公开行情页面,不涉及登录、下单、锁仓等账号行为,属合理使用范围。

Q2:selenium 太慢,能换成 requests 吗?
欧易主体数据由 JS 渲染,requests 拿到的 HTML 缺字段。若非要加速,可研究 Playwright 或用 websocket反推价格流

Q3:币种超两百个导致列数过多怎么办?
改为“窄表”结构设计:
(id, timestamp, symbol, price)
每条记录四个字段,查询时用 GROUP BY 或 time bucket。

Q4:我想接入多个交易所怎么扩展?
把域名、抓取逻辑封装到函数里:

fetch_okx(); fetch_binance(); fetch_gateio();

并行跑即可。

Q5:钉钉机器人如何申请?
在钉钉群右上角“群设置→智能群助手→添加机器人→自定义”,复制 Webhook 粘贴即可。


结束语

不到一百行代码,你已成功搭起自己的专属“行情雷达”。下一步可加入:MACD 计算、套利信号、定投提醒、Stable Coin 利率曲线等功能,把数据库历史作为量化策略回测的素材。

👉 立即去看看欧易最新上架的热门小币种,提前发现百倍潜力!