
本文介绍如何在无官方 api 的前提下,通过服务端自动化爬取与定时轮询,实时监控股票价格等动态网页数据,并在触发阈值时主动通知用户。适用于初学者,涵盖技术选型、基础实现与关键注意事项。
本文介绍如何在无官方 api 的前提下,通过服务端自动化爬取与定时轮询,实时监控股票价格等动态网页数据,并在触发阈值时主动通知用户。适用于初学者,涵盖技术选型、基础实现与关键注意事项。
在缺乏公开 API 的场景下(例如仅提供前端渲染的印度股市行情页),若需在服务端持续监控页面中某价格字段的变化并实现阈值告警,核心思路是:服务端定时获取 HTML → 解析目标数据 → 比较变化/阈值 → 触发通知。整个流程必须脱离个人设备,完全运行于服务器环境。
技术选型建议(兼顾入门友好与生产可用)
- 语言与框架:Python(推荐)或 Node.js。相比 PHP + Cron 的原始方案,Python 生态更成熟:requests 稳定抓取、BeautifulSoup / lxml 精准解析、schedule 或系统 cron 灵活调度,且调试便捷。
- 部署环境:Linux 服务器(如 Ubuntu)、Docker 容器或云函数(如 AWS Lambda + EventBridge 定时触发),确保 24/7 运行。
- 通知方式:邮件(smtplib)、Telegram Bot(HTTP API)、Webhook(推送到企业微信/钉钉)或数据库记录+前端轮询。
基础实现示例(Python)
以下是一个最小可行代码片段,每 10 秒检查一次某股价是否突破 ₹2,500:
import requests
from bs4 import BeautifulSoup
import time
import smtplib
from email.mime.text import MIMEText
# 配置项(请替换为实际 URL 和选择器)
URL = "https://example-stock-site.in/live/tata-motors"
PRICE_SELECTOR = "#stock-price" # 使用浏览器开发者工具定位价格元素的 CSS 选择器
THRESHOLD = 2500.0
LAST_PRICE = None
def fetch_and_check_price():
global LAST_PRICE
try:
headers = {"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"}
res = requests.get(URL, headers=headers, timeout=10)
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")
price_elem = soup.select_one(PRICE_SELECTOR)
if not price_elem:
print("⚠️ 未找到价格元素,请检查选择器")
return
current_price = float(price_elem.get_text(strip=True).replace(",", ""))
if LAST_PRICE is None:
LAST_PRICE = current_price
print(f"✅ 初始化价格: ₹{current_price}")
return
if current_price > THRESHOLD and current_price > LAST_PRICE:
alert_msg = f"? 股价突破阈值!当前价: ₹{current_price}(阈值: ₹{THRESHOLD})"
print(alert_msg)
send_email_alert(alert_msg)
LAST_PRICE = current_price # 更新状态
except Exception as e:
print(f"❌ 请求或解析失败: {e}")
def send_email_alert(message):
# 示例:使用 Gmail SMTP(需开启应用专用密码)
msg = MIMEText(message)
msg["Subject"] = "【股价告警】价格已突破设定阈值"
msg["From"] = "your@gmail.com"
msg["To"] = "user@example.com"
with smtplib.SMTP_SSL("smtp.gmail.com", 465) as server:
server.login("your@gmail.com", "your_app_password")
server.send_message(msg)
# 主循环(生产环境建议改用 cron 或 APScheduler)
if __name__ == "__main__":
print("? 股价监控服务已启动...")
while True:
fetch_and_check_price()
time.sleep(10) # 每10秒检查一次(根据网站反爬策略调整)关键注意事项与进阶提示
-
反爬应对:
- 务必设置 User-Agent 和合理 timeout;
- 避免高频请求(如 <5 秒间隔),可引入随机延迟(time.sleep(10 + random.uniform(0, 5)));
- 若页面含 JavaScript 渲染(如 React/Vue),需改用 Playwright 或 Selenium 启动无头浏览器,但资源开销显著增加。
-
健壮性增强:
- 添加日志记录(logging 模块)便于排查;
- 使用数据库(如 SQLite/PostgreSQL)持久化历史价格与告警记录;
- 封装为 CLI 工具或 systemd 服务,支持启停与异常自恢复。
-
法律与合规提醒:
- 务必查阅目标网站 robots.txt 及《服务条款》,避免违反爬虫政策;
- 仅用于个人学习或非商业用途,禁止高频压测或数据转售;
- 敏感信息(邮箱密码、API Token)切勿硬编码,应通过环境变量管理(os.getenv())。
掌握该模式后,你不仅能监控股价,还可扩展至航班状态、商品库存、新闻标题等任意公开网页的变更追踪——本质是构建一套轻量级、可定制的“网页变化监听器”。从 requests + BeautifulSoup 入手,再逐步引入异步(aiohttp)、任务队列(Celery)或监控看板(Grafana + Prometheus),即可平滑进阶至工业级运维方案。










