本文将带你用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)本地跑久了最好搭配nohup或pm2,防止 SSH 掉线进程终止。
五、避坑锦囊:三项易被忽略的细节
- 币种同步延迟
欧易偶尔隐藏小流动性币种。正则没匹配到新币时不要慌,重跑一次即可。 - 价格千位分隔符
必须replace(',', '')再float(),否则ValueError血亏。 - 数据库大量空白值
如果脚本中断,重启时有概率缺某一币种。可以加默认值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 利率曲线等功能,把数据库历史作为量化策略回测的素材。