“把网页当程序跑”——这是 Jeff Lindsay 的 webframe 项目给出的说法。你给它一个网址或文件,它就在隐藏的无头网页视图里执行,把 console.log() 输出到标准输出,把异常输出到标准错误。

这个项目用 Go 写成,构建在 glaze 库之上。glaze 提供对系统浏览器的访问能力:macOS 上是 WKWebView,Linux 上是 WebKitGTK,Windows 上是 WebView2。因此 webframe 不需要自己打包一套浏览器引擎。

它让人想起 shot-scraper 的 javascript 工具,只是体积小得多,也不依赖 Playwright。为了摸清它的底细,有人让 Claude Opus 5.5 对它做了一轮测试并整理成研究报告。

测试的思路分几步走:

  • 打开 webframe 的 GitHub 仓库,把项目跑起来;
  • 用它搭几个探索性的原型;
  • 评估它作为沙箱工具的潜力;
  • 评估它按 shot-scraper JavaScript 那套模式抓取网页的能力。

换句话说,同一个工具被放在两个完全不同的场景里审视:一边是隔离执行不可信代码的沙箱,一边是日常抓网页的脚本工具。前者看重的是边界是否可靠,后者看重的是用起来顺不顺手。

webframe 的取巧之处在于不重复造轮子。系统里本来就有浏览器,glaze 把它调出来用,项目本身只负责“执行网页、转发输出”这一层。体积小、依赖少,代价是把渲染和执行的底子交给了各平台的系统浏览器。

至于它在这两个方向上到底表现如何,那份研究报告给出了答案。对一个还在早期的小项目来说,能被这样认真地当工具来检验,本身就是一种待遇。