盯着某个商品价格或者库存变动时,人工每隔半小时刷新一次页面既耗费精力又容易遗漏。我在 Windows 上装了 changedetection.io 0.60.9,用本地静态页当监控目标,把页面里的 ¥199 改成 ¥149,库存从「有货」改成「只剩 3 件」,它成功比对出红绿高亮差异。

changedetection.io 是基于 Python 开发的开源网页变更监控服务。给它一个链接,它定期抓取并算哈希,再和上一版比文本差异,有变化就把改动部分标出来。

它不做什么

先把边界说清楚,这次实测基于本地环境,有四件事它没做到:

  • 默认拦内网和保留 IP,监控本机或局域网设备要先开开关放行
  • 默认依赖库没配无头浏览器驱动时,不处理复杂的 JavaScript 动态渲染页面
  • 邮件、Telegram 和 Webhook 等外部通知渠道,本次没验证真正发送
  • Docker 镜像与 TLS 反向代理配置也没有覆盖

用之前先准备好什么

  • Python 运行环境,以及 pip 包管理工具
  • 600MB 左右的磁盘空间,安装会连带装上 171 个包(Flask 和 selenium 等)
  • 监控对象在本地或局域网内的话,还要配置允许访问私有地址的环境变量

安装用了多久,占多少空间?

建虚拟环境再装指定版本:

py -3.13 -m venv D:/wb_cache/cdio/venv
D:/wb_cache/cdio/venv/Scripts/pip install changedetection.io==0.60.9

实测装完 4 分 45 秒,venv 目录占 570MB,Scripts 下生成 changedetection.io.exe,--help 参数完整。

怎么起服务、怎么加监控?

先在本机起一个静态页当靶标:

cd /d D:/wb_cache/cdio/site
..\venv\Scripts\python -m http.server 8099

输出 Serving HTTP on 0.0.0.0 port 8099,浏览器打开是 200,页面标题「shiceku.com 实测用页面」,正文写着价格 ¥199、库存有货。

然后启动监控服务,-u 直接把这条链接录进去:

D:/wb_cache/cdio/venv/Scripts/changedetection.io.exe ^
  -d D:/wb_cache/cdio/datastore -C -p 5000 -h 127.0.0.1 ^
  -u http://127.0.0.1:8099/

界面起在 http://127.0.0.1:5000,首页 200,左上角显示 v0.60.9。

每个参数管什么?

参数作用
-d数据存储目录,监控项、历史版本都落在这里
-pWeb 界面监听端口,例子用 5000
-h监听主机地址,设 127.0.0.1 时只有本机能访问
-u进程启动时直接录入要监控的 URL,省得进界面点
-C检查配置

第一次抓取为什么直接失败?

第一次抓取没成功,监控项里报的是:

Fetch blocked: "http://127.0.0.1:8099/" resolves to a private/reserved IP address

0.60.9 默认拦截私有网段与保留地址,避免服务被当成探测内网的工具。监控本机或局域网设备,必须先放行。

放行办法:在当前终端执行 set ALLOW_IANA_RESTRICTED_ADDRESSES=true,再重新拉起进程。这一步不做,后面所有检查都会失败。

改内容之后,它到底记下了什么?

重启后点「重新检查」,check_count 从 1 变成 2,previous_md5 写入,last_error 变成 false。

接着把靶标页的 ¥199 改成 ¥149,库存改成「只剩 3 件」,再加一行备注,再点一次检查。

结果:last_changed 写入新时间戳,diff 页把旧的三行标红、新的四行标绿,页面标题也被自动读出来显示在记录里。

监控项列表里几个字段的含义:

字段含义
check_count累计检查了几次,每检查一次加一
last_checked最后一次检查的时间
last_changed最后一次检测到内容变化的时刻,没变过就不写
last_error最后一次检查的错误信息,抓取失败时这里是原文报错
previous_md5上一版内容的哈希,用来判断这次是不是真变了

常见问题

能监控需要登录才能看的页面吗?

这次没测。登录态涉及 cookie 或表单提交,不在本次验证范围内,不敢替你保证能用。

能抓 JavaScript 渲染出来的内容吗?

默认不行。依赖库没配无头浏览器驱动时,它拿到的是原始 HTML,页面里靠 JS 后填的内容抓不到。要处理这类页面得额外配浏览器驱动,本次没有验证。

有变化能推到手机吗?

界面里有邮件和 Telegram 这类渠道,但本次只验证到「检测并显示差异」,通知真正发出去这一步没有测。

服务重启之后,之前的记录会丢吗?

不会。只要 -d 指向同一个数据目录,重启后监控项和历史版本都还在。实测重启后 check_count 是在原有次数上继续累加的。

能同时监控多个页面吗?

这次只验证了单条链接(用 -u 录进去)。多页面在界面上能不能批量加、并发检查会不会互相拖慢,本次没有测。

适合谁,不适合谁

适合想在本机快速部署的人。挂机盯住网页文本、价格或通知栏的变动,不用搭重型监控栈。

反过来,如果页面大量依赖 JavaScript 渲染,或者需要登录态,又或者你要的是稳定的手机推送,这三块这次都没有验证,就没法替你担保。