盯住网页改动并自动通知(changedetection.io)
changedetection.io 是一个用 Python 写的自托管网页变更监控工具,把要盯的 URL 加进去,它按间隔重新抓取并对比内容,命中变化就通过 Discord、Email、Slack、Telegram 或 Webhook 通知你。这篇文章梳理它的功能边界、安装路径、关键配置项,以及真实 Issue 里暴露过的坑,帮准备自建监控的人判断它是否合用。
网页上的关键信息什么时候变,多数站点不会告诉你。价格页、库存页、招聘页、政府公告、安全通告、PDF 文件,更新往往悄无声息,多数站点也不提供 RSS。changedetection.io 把定时抓取、差异比对、触发通知这三件事装进一个可以自己部署的 Web 应用,配置全部在浏览器界面里完成。
changedetection.io 是用 Python 写的自托管网页变更监控工具,输入一组要盯的网址,输出变更差异与通知,用于盯价格、库存、公告与页面篡改。
典型用法是把它长期挂在服务器上,按设定的间隔重新抓取每个页面,把新旧内容做对比,命中你关心的变化就发出去。README 列出的用例包括补货提醒、降价提醒、PDF 文本变化、JSON API 响应变化、招聘页关键字、法律与合规文档更新,也包括网站被篡改的监测。通知渠道覆盖 Discord、Email、Slack、Telegram 与 Webhook。

它不做什么
自托管版本的部署与长期维护由你自己负责。项目另有托管订阅方案,README 里标价 $8.99/月,走的是别人替你跑代理和运维的路线。
AI 变更摘要与 AI 变更规则这两项,README 明确标注为 Available in our subscription/hosted service from June 2026,开源自托管版本是否包含,仓库里没有说明。Visual Selector 的可视化元素选择要在接入 playwright content fetcher 时才能用,README 注明该 fetcher 包含在订阅服务中。
默认抓取不执行页面上的 JavaScript。要处理 JS 渲染出来的内容,得换用 WebDriver 或 Playwright 抓取方式,Browser Steps 也要求先启用 Playwright。项目也不承诺穿透反爬,Issue 列表里有一条待解决的 Improve 「bot-detection」 evasion techniques,是用户提出的规避技术改进请求,目前仍是开放状态。
用之前先准备好什么
- 一台能长期在线的主机。监控靠按间隔轮询,机器一停就没有通知。
- 容器运行时,或者一套 Python 环境。仓库根目录同时带
Dockerfile与docker-compose.yml,另外有setup.py、requirements.txt、README-pip.md,说明 pip 安装也是一条官方路径。 - 一份要监控的 URL 清单,以及每个页面里你真正关心的那部分内容——整页对比通常噪音很大。
- 通知渠道的接入信息,比如 Webhook 地址、Bot Token、SMTP 参数。README 只列出支持哪些渠道,没有给出每个渠道的配置字段。
- 需要登录才能看到内容的页面,用 Browser Steps 预先填表单、点按钮,账号凭据由你自己准备。
主要功能
- 网页变更监控与多渠道通知:把 URL 加进 watchlist,设定检查频率,内容变化后通过 Discord、Email、Slack、Telegram、Webhook 等渠道发提醒。
- 差异对比:变更详情可以按词、按行、按单个字符三种粒度查看,用来判断改动是一处价格数字,还是整块导航被重排。
- 触发器过滤:README 的 Key Features 里举了
Trigger on text一类的过滤器,用来只在特定文本出现或消失时才通知。这一节在拿到的 README 节选里被截断,完整的过滤器清单要看仓库原文。 - 单商品页的库存与价格监控:打开
Re-stock & Price detection for single product pages后,工具会从页面 HTML 的元数据里提取价格信息,可以设置价格上限、下限与价格变化百分比来触发通知,并在图表里看历史走势。 - Browser Steps:抓取之前先跑一段浏览器操作,例如登录网站、把商品加入购物车、接受 cookie 弹窗、填日期、收窄搜索结果,用来监控藏在交互后面的内容。
- Visual Selector:在页面上直接点选要监控的区域和元素,先跑完 Browser Steps,再切到这个标签页细化选取范围。
- JS 渲染抓取:支持 WebDriver 与 Playwright 两种带浏览器的方式,处理前端渲染的页面。
- 非 HTML 输入与 RSS 输出:可以监控 JSON API 的响应变化、跟踪 PDF 文件里的文本改动,也可以把内容变化做成 RSS 订阅源。
安装与最短示例
仓库地址是 https://github.com/dgtlmoon/changedetection.io,Apache-2.0 许可证,主要语言 Python(占 79.0%)。开源路径有两条:容器与 pip。
# 仓库根目录已提供的部署相关文件
docker-compose.yml
Dockerfile
docker-entrypoint.sh
README-pip.md
setup.py
requirements.txt
拿到的 README 节选在安装章节之前就被截断,镜像名、默认端口、环境变量这些仓库里没有在这段内容中给出,需要对照 README 与 docker-compose.yml 原文。仓库里没有说明这一步,我不替它补。
最短能跑通的流程走的是界面,不是命令:服务起来之后用浏览器进入界面,新增一条要监控的 URL 加进 watchlist;如果盯的是商品页,打开 Re-stock & Price detection for single product pages;如果页面需要先登录,配好 Browser Steps;最后选一个通知渠道填上参数。这四步之后,下一次内容变化就会推到你选的那个渠道里。
关键参数
Re-stock & Price detection for single product pages # 单商品页的库存与价格监控开关
Browser Steps # 抓取前执行的浏览器交互步骤
Visual Selector # 在页面上点选要监控的元素
Trigger on text # 触发器过滤器之一
OpenAI-compatible (vLLM, LM Studio, llama.cpp) # LLM 提供方下拉项
Re-stock & Price detection for single product pages 配套的是价格上限、价格下限、价格变化百分比这几个通知参数,README 里对应的设置界面写的是 upper and lower price、price change percentage。
LLM 相关配置在 README 里写的是支持 OpenAI、Gemini、Anthropic、Ollama,以及能填 /v1 地址的自建服务,下拉项里对应 OpenAI-compatible (vLLM, LM Studio, llama.cpp)。这一块由 LiteLLM 驱动,README 说覆盖 100+ 提供方与模型。要注意这些能力 README 标注为订阅与托管服务提供。
Issue 里还出现过 Recheck 这个操作入口,用于手动重查某个已添加的监控项。
结果在哪里看
主要的输出去向有四个。第一是 watchlist 界面,每条监控项的状态、上次检查时间与是否触发都列在这里。第二是差异视图,可以按词、按行、按单个字符切换查看改动细节。第三是价格趋势图,只有打开了单商品页的价格监控才有。第四是通知渠道本身,以及可以把变更做成 RSS 订阅源。
实际使用中的坑
- 空白 diff 也会触发通知:Issue 里反馈过一部分站点会发来「有变化」的通知,但打开差异是空的,原因是过滤条件可用性发生波动。这条已经标记为已解决,评论区 135 条,是评论最多的一个问题。
- 304 Not Modified 缓存处理在反代场景下会让请求失败:Issue 记录显示这是上游问题引起,运行在反向代理后面时更容易碰到。目前状态是待解决。
- 部分 xpath 过滤器报错:现象是
'str' object has no attribute '__name__',只在某些 xpath 过滤器上出现,Issue 目前待解决。 - 批量重查时更新失败:Realtime updates 下同时排队检查多个站点,有时会出现更新失败,Issue 记录的平台是 Docker 容器 v0.52.1,目前待解决。
横向对照
| 项目 | 适合谁 | 部署方式 | 主要限制 | 什么情况下选它更合适 | 项目地址 |
|---|---|---|---|---|---|
| changedetection.io | 想自己托管、盯着几十到几百个具体页面变化并要通知的人 | Docker 或 pip,仓库同时提供 Dockerfile 与 docker-compose.yml | AI 摘要与 Visual Selector 在 README 里标注为订阅/托管服务提供;JS 页面需要另配 WebDriver 或 Playwright;392 个开放 Issue | 目标是「某几个页面的内容变了要立刻知道」,并且希望数据落在自己机器上 | changedetection.io |
| netdata/netdata | 需要盯服务器、容器等基础设施运行指标的运维 | 仓库没有说明 | 方向是基础设施指标监控,不负责抓取网页内容并做变更比对,两者要解决的问题不重合(未逐一核实) | 你要看的是主机与容器自身的资源曲线,而不是页面文字有没有变 | netdata/netdata |
| unclecode/crawl4ai | 要为模型准备网页语料的数据工程 | 仓库没有说明 | 方向是网页抓取与内容整理,不提供变更比对与通知(未逐一核实) | 你需要批量把页面内容抓下来交给模型处理,而不是盯少数页面的变化 | unclecode/crawl4ai |
后两个项目放进这张表,是因为它们和 changedetection.io 处在相邻的选型位置,但要做的事并不相同:netdata 是基础设施指标方向,crawl4ai 是抓取与内容整理方向,都不提供「页面内容变了就通知我」这条链路,这里只是给同类选型的读者一个参照。
反过来说,如果你要的是大规模抓取并把正文整段喂给大模型,changedetection.io 不是合适的工具,它的抓取是为差异比对服务的,输出的是改了哪里;crawl4ai 那类项目更对路。如果你要的是服务器 CPU、内存、网络这些颗粒度很细的指标,netdata 覆盖得比一个网页监控工具深得多。它的 AI 变更摘要目前也只在订阅与托管服务里提供,不想付费又要 AI 判断的话,得自己接模型。
合规与授权边界
这个项目的核心动作是周期性抓取网页,所以使用边界要先说清楚:只对你自己拥有的资产,或者已经拿到明确授权的目标做监控。未经许可对第三方站点做高频轮询,可能违反目标站点的服务条款,也可能触发当地关于计算机访问与数据获取的法律风险,被平台封 IP、封账号是常见后果。
Browser Steps 支持登录后抓取,这一步尤其要注意:用别人的账号登录别人系统去拉数据,性质和爬公开页面不一样。价格与库存监控在零售场景里用得很广,但同样要控制在对方允许的访问频率内。项目本身不替你做授权判断,Issue 里那条关于避让 bot 检测的请求目前仍待解决,也说明抓取能否成功取决于目标站点的策略。
适合谁
适合想把监控数据握在自己手里的开发者和运维,手上有一批具体页面要盯,比如十几个竞品价格页、几十家供应商的库存页、自己公司的对外公告页,并且愿意为容器和通知渠道做一次配置。也适合本身就有服务器、不想为这类功能按月付费的人。
适合能接受一点折腾的人:JS 渲染要另配抓取器,登录页面要配 Browser Steps,AI 摘要要用就得走订阅或自己接模型。反过来,如果你只想打开网页填个邮箱就完事,或者要监控的是成千上万个域名级别的抓取任务,这个项目的形态并不合适。
焚评:这个项目的量化评分
本项目的选题来自 焚.com(一个按公开公式给 GitHub 项目打分的站)。焚评当前总分 9.9 分(满分 10)。下表是各维度的得分:
| 评分维度 | 得分 |
|---|---|
| 热度动量(权重 25%) | 10.0 / 10 |
| 开发活跃(权重 25%) | 10.0 / 10 |
| 社区响应(权重 15%) | 9.2 / 10 |
| 文档质量(权重 15%) | 10.0 / 10 |
| 发布节奏(权重 10%) | 10.0 / 10 |
| 风险控制(权重 10%) | 10.0 / 10 |
评分口径、权重与计算方式见焚.com 的评分方法页;数据随 GitHub 指标刷新,具体数值以焚.com 当前页面为准。本文正文为诀.com 独立撰写,评分数据由焚.com 授权引用。
内容核验说明
收录它是因为把能力边界与已知问题放在一起讲:README 标注为订阅/托管服务提供的 AI 摘要与 Visual Selector、JS 页面需另配抓取器,以及几类待解决的 Issue,都关系到自建前能否对得上需求。适合手上有具体页面要盯、愿意自己跑容器的开发者与运维。文中收费与评分数据来自公开披露,诀.com 未独立验证;
文中 README 定价 $8.99/月、Python 占比、392 个开放 Issue 等数据来自仓库与原作者公开披露,诀.com 未独立验证;所引 Issue 现象与状态转述自仓库报告,未做复现测试;焚评评分由焚.com 授权引用,随 GitHub 指标刷新。用户反馈摘要
根据仓库 Issue 来看,反馈以已解决的缺陷报告为主:空白 diff 误触发通知、0.50.41 在 Docker 下覆盖 url-watches.json 导致监控项丢失、通知被发成 HTML、测试通知不含 {{triggered_text}}、编码与 lxml 报错、WebSocket 支持后界面加载变慢等,提交者多附版本号与复现步骤。待解决的包括为抓取器增加响应头监控以满足 PCI DSS 11.6.1,以及改进规避 bot 检测的技术;另有导入 distill.io 数据、邮件通知等需求。
基于该仓库公开 Issue 整理,只反映提交者报告的现象与诉求,不代表诀.com 立场,也不代表问题已被确认。项目来源与说明
开源项目:dgtlmoon(dgtlmoon)
本文由诀.com 编辑基于该项目的公开信息独立撰写,属原创解读,不是对项目文档的翻译或转载;文中提到的功能与参数以官方仓库为准,代码与文档版权归原作者所有。
查看项目仓库