干过网页自动化的人都懂这种憋屈:要的信息藏在二级页面里,得点「加载更多」才出来;想定期看某个公告页有没有更新,只能每天手动打开一次;还有一批需要登录才能看的页面,脚本一跑就掉登录态,第二天又得扫码。
以前的解法是写爬虫或者 Playwright 脚本,代价是要自己维护选择器,网页改一次版脚本就废一次。现在 WorkBuddy 自带的浏览器操控能力(官方名 Agent Browser)把「点、翻、填、截图」这层接管了,但它不负责长期巡检。这篇文章讲两件事:Agent Browser 能干到哪一步、它干不了的那部分怎么用 90 行 Python 补上。
分工一句话:需要「动手」的交给 Agent Browser,需要「长期盯着」的交给本地脚本。 前者靠浏览器真实登录态解决"进不去",后者靠哈希快照 + 归一化 diff 解决"不知道变了没有"。两者拼起来才是完整闭环。适用边界:公开页面、结构稳定的页面;有滑块/短信验证码、强风控的站点,谁都救不了。
Agent Browser 靠浏览器扩展实现,当前优先适配 Chrome / Edge / QQ 浏览器。判断装没装,别去翻设置页,直接扫扩展目录更准:
# 环境:macOS,Python 3.11+(零第三方依赖)
ls -1 "$HOME/Library/Application Support/Google/Chrome/Default/Extensions"目录下每一串 32 位字符就是一个扩展 ID,真正的名字在 manifest.json 里。我把它写成了脚本的一个子命令:
python3 browser_watch.py --probe输出长这样(本机实跑,非 WorkBuddy 的扩展 ID 已打码):
== 浏览器本体 ==
Chrome 已安装 /Applications/Google Chrome.app
Edge 未安装 /Applications/Microsoft Edge.app
QQ浏览器 未安装 /Applications/QQ浏览器.app
== Chrome 已安装扩展 ==
ajnnogdfpilbhkeggdjlcokgglijmdde WorkBuddy <== 目标扩展
******************************** __MSG_extName__(国际化名)
共 4 个扩展,命中 WorkBuddy:是踩点:很多扩展的 name 是 __MSG_extName__ 这种国际化占位符,直接读 manifest 拿不到真名,得再查 _locales。所以判断"是不是目标扩展"要同时兼容占位符,不能只做字符串相等。
自然语言不等于随便说。实测下来,指令必须凑齐四样:链接、动作、范围、输出格式。反例:"帮我看下这个网页,整理一下内容"——它会漏抓。正例:
打开 http://127.0.0.1:8731/notice.html
依次展开页面里所有折叠区块,点完「加载更多」
只提取正文里的条款条目,不要导航栏和页脚
整理成 Markdown 表格,关键区块各截一张图
遇到验证码/滑块就停下来等我手动处理,不要自己尝试最后那句很重要,是安全边界不是客套话。
Agent Browser 适合"现在马上去做一次",不适合"每天自己看一眼有没有变"。后者用快照比对更稳。核心逻辑三步:抓页面 → 归一化 → 比哈希。
# 首次:抓基线
python3 browser_watch.py --snap --config watchlist.json --store .watch_store
# 之后每次:跟上次比,只报真变化
python3 browser_watch.py --diff --config watchlist.json --store .watch_storewatchlist.json 长这样(示例 URL 为虚构演示页面):
{
"watchlist": [
{ "name": "示例公告页", "url": "http://127.0.0.1:8731/notice.html" }
]
}归一化是这一步的灵魂,顺序不能乱:
t = RE_SCRIPT.sub(" ", html) # 1. 去 script/style —— 最大噪音源
t = RE_TAG.sub("\n", t) # 2. 去标签
t = RE_NUMRUN.sub("<N>", t) # 3. 去 6 位以上长数字(时间戳、流水号)
t = RE_HEX.sub("<H>", t) # 4. 去 16 位以上十六进制(hash、csrf token)顺序反了就完蛋:先去长数字会误伤正文里的编号,先去标签会让 <script> 的正则失配。
WorkBuddy 的定时任务直接指向这条命令即可,产出落在 .watch_store/diff-*.txt。前提:电脑得开着、WorkBuddy 得在线,它不是云端 Serverless,关机就是暂停。
以下全部为本机实跑(macOS Apple Silicon,Python 3.13.12,本地 HTTP 演示服务,页面内容为虚构示例):
项目 | 实测值 |
|---|---|
| 约 40 ms |
单页面抓快照 | 7 ms(6 行正文 / 373 字节) |
单次 diff 比对 | 7 ms |
只改时间戳 + script 随机数 | 判为无变化(0 行差异) |
改联系人 + 新增一条条款 | 判为有变化,输出 11 行 diff |
对照组:不做归一化直接比原始 HTML | 误报 2 行 |
关键就在那个对照组:同一对"只改了时间戳"的页面,原始哈希不同、直接比文本有 2 行差异,归一化后 6 行正文完全一致。省掉归一化,你的巡检脚本会天天报假警,报到最后你就不看了。
[DIFF] 示例公告页 变化 11 行
@@ -5,2 +5,3 @@
提交截止:2026-11-02
-联系人:示例-张三
+联系人:示例-李四
+新增:补充说明条款 C未实测项:对真实外网页面的巡检误报率、Agent Browser 跑完一个真实多步任务的总耗时 —— 【待本人实测补充】,本稿不编造数字。
Content-Encoding: gzip 的话,拿到的是一坨二进制,decode 出来全是乱码。脚本里必须手动 gzip.decompress;遇到 br/deflate 直接报错,别硬猜。Agent Browser 解决"进不去、点不动、要登录",本地脚本解决"长期盯、变化告警、留档"。别指望一个工具通吃,把边界切清楚,两个都不难用。
#WorkBuddy# 网页上没有按钮的操作怎么补:Agent Browser 浏览器操控 + 本地巡检脚本的分工(macOS 实操,附零依赖脚本)--probe 的终端输出(浏览器 + 扩展命中)--diff 抓到真变化时的终端输出.watch_store 目录里的快照与 diff 归档文件文件 | 说明 |
|---|---|
| 主脚本, |
| 监控清单示例(URL 为虚构演示地址) |
| 虚构演示页面 v1 |
| 虚构演示页面 v2(用于触发 diff) |
|
|
| snap / diff / 对照组真实输出 |
复现命令:
cd assets/demo-pages && python3 -m http.server 8731 --bind 127.0.0.1,另开终端跑--snap→ 换 v2 → 跑--diff。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。