
本文介绍如何在无官方 api 的前提下,通过服务端定时抓取、解析与比对网页内容,实现对动态更新数据(如股票价格)的持续监控与阈值告警,适用于初学者快速搭建轻量级监控系统。
本文介绍如何在无官方 api 的前提下,通过服务端定时抓取、解析与比对网页内容,实现对动态更新数据(如股票价格)的持续监控与阈值告警,适用于初学者快速搭建轻量级监控系统。
在实际运维与数据采集场景中,常遇到目标网站仅提供前端渲染页面、不开放结构化 API 的情况(例如部分财经资讯站实时显示印度股市行情)。此时,若需在服务端自动监测关键字段(如某只股票最新价)是否突破预设阈值,并及时通知用户,可采用「服务端网页监控」方案——即绕过客户端 JavaScript 渲染逻辑,直接由服务器周期性获取 HTML、提取目标数据、执行条件判断并触发动作。
该方案核心由三部分组成:稳定的数据获取 → 准确的内容提取 → 可靠的状态决策与响应。以下以 Linux 服务器环境为例,使用 Python(兼顾可读性与生态成熟度)配合 requests + BeautifulSoup 实现,辅以 cron 定时调度,全程无需浏览器或前端运行环境。
✅ 基础实现步骤(Python 示例)
# monitor_stock.py
import requests
from bs4 import BeautifulSoup
import time
# 配置项(请替换为真实目标 URL 和选择器)
TARGET_URL = "https://example-stock-site.in/live/NIFTY50"
PRICE_SELECTOR = "#live-price" # CSS 选择器,定位价格元素(需根据实际网页审查确定)
ALERT_THRESHOLD = 22500.0 # 触发告警的价格阈值
LOG_FILE = "/var/log/stock_monitor.log"
def get_current_price():
try:
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36"
}
resp = requests.get(TARGET_URL, headers=headers, timeout=10)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
price_elem = soup.select_one(PRICE_SELECTOR)
if not price_elem:
raise ValueError("Price element not found")
raw_text = price_elem.get_text(strip=True).replace(",", "")
return float(raw_text)
except Exception as e:
with open(LOG_FILE, "a") as f:
f.write(f"[{time.ctime()}] ERROR: {e}\n")
return None
def check_and_alert():
current = get_current_price()
if current is None:
return
if current > ALERT_THRESHOLD:
# 此处可扩展:发送邮件、Webhook、写入数据库等
print(f"? ALERT: NIFTY50 price {current} > threshold {ALERT_THRESHOLD}")
# 示例:调用系统命令发送邮件(需提前配置 mailutils)
# os.system(f'echo "Price exceeded!" | mail -s "Stock Alert" admin@example.com')
if __name__ == "__main__":
check_and_alert()? 关键提示:选择器调试
使用浏览器开发者工具(F12 → Elements → 右键元素 → Copy → Copy selector)获取稳定、唯一的 CSS 选择器;避免依赖动态 ID 或内联样式类。若页面依赖 JavaScript 渲染(如 React/Vue),则需改用 Playwright 或 Selenium 启动无头浏览器(增加资源开销,非必需时不推荐)。
⚙️ 部署为服务端定时任务
将脚本加入系统级定时任务,确保后台持续运行:
# 编辑当前用户的 cron 表 crontab -e # 添加一行(每 15 秒执行一次 — 注意:cron 最小粒度为 1 分钟;高频轮询建议用 systemd timer 或简单 while 循环) # 每分钟执行一次: * * * * * /usr/bin/python3 /opt/monitor/monitor_stock.py >> /var/log/stock_monitor.log 2>&1 # 或使用更灵活的循环守护(推荐用于秒级监控): # 创建 /opt/monitor/run_monitor.sh: #!/bin/bash while true; do python3 /opt/monitor/monitor_stock.py sleep 15 done # 然后用 systemd 托管(略去 unit 文件细节,确保开机自启与日志管理)
⚠️ 注意事项与最佳实践
- 遵守 robots.txt 与网站条款:检查目标站点 robots.txt 是否允许爬取,避免高频请求导致 IP 被封;建议设置合理间隔(≥10–30 秒),添加随机延迟。
- 异常健壮性:网络超时、HTML 结构变更、空值/格式异常(如“—”、“N/A”)必须捕获处理,避免脚本中断。
- 状态持久化(进阶):单纯轮询无法感知“变化”,建议记录上一次有效值到文件或 Redis,仅当新值 ≠ 旧值且满足阈值时才告警,减少误报。
- 安全加固:脚本运行在独立低权限用户下;敏感配置(如 Webhook 地址)应从环境变量或加密配置文件读取,勿硬编码。
- 可观测性:输出结构化日志(含时间戳、状态码、价格、是否告警),便于后续接入 ELK 或 Prometheus+Grafana。
掌握此模式后,你不仅能监控股价,还可迁移至航班状态、汇率、竞品价格、政策公告等任意公开网页数据源——本质是构建一套自主可控的「轻量级网络数据哨兵」。起步无需复杂框架,重在理解数据流闭环:拉取 → 解析 → 判断 → 响应 → 日志 → 优化。









