
每年 10 月下旬到 11 月底是海外 VPS 促销最密集的时段:RAKsmart 的双 11/黑五大促已经开跑,RackNerd 刚放出 $21.99/ 年的年付特价,NovixLink 的国庆年付优惠也持续到 10 月 31 日。这类促销的共同点是——好价机型靠抢,热门机房补货、上架经常只持续几小时,靠人肉刷页面基本抢不到。
今天这篇不讲哪家便宜(想先看怎么避坑可以读这篇 → 黑五季捡漏指南:买便宜 VPS 前先看这 6 个避坑点),而是动手解决一个实际问题:怎么第一时间知道促销页变了?
前置知识:会装 Python 3(任意 3.8+ 版本都行)、知道怎么用 cron 定时跑脚本。本文代码只用标准库,零依赖,复制粘贴就能跑。
思路:快照对比 + 关键词提醒
监控促销页不需要什么高深技术,核心就是三步:
- 抓页面正文:用
urllib拉取页面,去掉 HTML 标签、脚本样式,得到纯文本; - 算快照:对纯文本算 SHA256 哈希,存进 JSON 文件;
- 对比报警:下次运行时对比哈希,变了就报警;同时检查是否命中你关心的关键词,比如"补货""降价""售罄"。
为什么不直接 diff 文本?因为促销整理页经常更新边栏、广告、评论区,直接 diff 噪音太大。哈希对比简单粗暴:变了就是变了,再人工去看一眼就行。
完整代码(可直接运行)
#!/usr/bin/env python3
"""VPS 促销页变更监控小脚本(纯标准库)。
用法: python3 vps_promo_monitor.py --state state.json
"""
import argparse, hashlib, json, os, re, sys, urllib.request
UA = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) vps-promo-monitor/1.0"}
# 想监控哪些促销页,就往这里加:名字 / URL / 关注关键词
WATCHLIST = [
{
"name": "RackNerd 年付促销",
"url": "https://www.zhujijie.com/1503.html",
"keywords": ["补货", "售罄", "21.99", "sold out"],
},
{
"name": "RAKsmart 双11/黑五大促",
"url": "https://www.zjfx.net/45521.html",
"keywords": ["补货", "售罄", "1.99", "秒杀"],
},
]
def fetch_text(url):
req = urllib.request.Request(url, headers=UA)
with urllib.request.urlopen(req, timeout=20) as r:
raw = r.read().decode("utf-8", errors="ignore")
text = re.sub(r"<script.*?</script>|<style.*?</style>", " ", raw,
flags=re.S | re.I)
text = re.sub(r"<[^>]+>", " ", text)
return re.sub(r"\s+", " ", text).strip()
def digest(text):
return hashlib.sha256(text.encode("utf-8")).hexdigest()[:16]
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--state", required=True, help="快照 JSON 文件路径")
args = ap.parse_args()
state = {}
if os.path.exists(args.state):
with open(args.state, encoding="utf-8") as f:
state = json.load(f)
alerts = []
for item in WATCHLIST:
name, url = item["name"], item["url"]
try:
text = fetch_text(url)
except Exception as e:
alerts.append(f"[ERROR] {name} 抓取失败: {e}")
continue
h = digest(text)
old = state.get(url)
hits = [kw for kw in item.get("keywords", []) if kw.lower() in text.lower()]
if old is None:
alerts.append(f"[NEW] {name} 已建快照 (hash={h})")
elif h != old:
alerts.append(f"[CHANGED] {name} 内容变化 (hash {old} -> {h})")
if hits:
alerts.append(f" 命中关键词: {', '.join(hits)}")
else:
print(f"[OK] {name} 无变化 (hash={h})")
state[item["url"]] = h
with open(args.state, "w", encoding="utf-8") as f:
json.dump(state, f, ensure_ascii=False, indent=2)
if alerts:
print("\n".join(alerts))
return 0 if not any(a.startswith("[ERROR]") for a in alerts) else 2
if __name__ == "__main__":
sys.exit(main())
把脚本存为 vps_promo_monitor.py,运行 python3 vps_promo_monitor.py --state state.json 即可。上面 WATCHLIST 里的两个 URL 是真实可访问的促销整理页(→ RackNerd 年付 $21.99 起促销整理,→ RAKsmart 双11/黑五大促整理),写这篇文章时实测都能正常抓取。
真实运行效果
先用一个本地测试页验证逻辑三轮:
=== 第一轮(建快照) ===
[NEW] 测试页 已建快照 (hash=322ac909653ed152)
=== 改页面内容(含关键词变化) ===
[CHANGED] 测试页 内容变化 (hash 322ac909653ed152 -> 134990a61ece575a)
命中关键词: 补货, 降价, 21.99
=== 第三轮(无变化) ===
[OK] 测试页 无变化 (hash=134990a61ece575a)
再对真实促销页跑一轮:
[NEW] RackNerd 年付促销 已建快照 (hash=1349b1af1efbd461)
抓取、哈希、快照落盘全部正常。之后每小时跑一次,页面一更新就会输出 [CHANGED],命中"补货""降价"这类词还会单独列出来。
挂到 cron 上,每小时自动跑
# 每小时整点跑一轮,结果追加到日志
0 * * * * cd ~/vps-monitor && python3 vps_promo_monitor.py --state state.json >> monitor.log 2>&1
想把提醒送到手机上也简单:在输出 [CHANGED] 的分支里加一段推送调用就行,比如 Server 酱、Telegram Bot、企业微信机器人。密钥、token 一律用环境变量或单独的配置文件读取,不要写死在脚本里,也不要贴到任何公开的地方:
import os
TG_TOKEN = os.environ.get("TG_BOT_TOKEN", "") # 从环境变量读,不写死
三个注意事项
- 别高频爬:每小时一轮足够了,促销页又不是股票行情;太频繁可能被目标站点的防火墙封 IP。
- 只看事实,不自动下单:脚本只负责"告诉你变了",下单前务必自己打开结算页核对价格和机房——促销页的价格经常滞后,以结算页为准。
- 价格口径:本文提到的促销价格(RackNerd $21.99/年、RAKsmart VPS 秒杀 $1.99/月起)均来自上述公开促销整理页,写稿时(2026-10-20)可查;促销名额有限,先到先得。
小结
黑五季拼的不只是手速,更是信息差。一个 60 行的脚本 + 一条 cron,就能把"人肉刷页面"变成"页面变了自动告诉我"。代码和思路都验证过可跑,改改 WATCHLIST 就能监控你关心的任何促销页。如果你也在蹲某家特价机,不妨今晚就把它跑起来。
本站的 /promos/ VPS 促销监控页 每周五也会汇总一轮促销信息,可以配合这个脚本一起用。
