先说清楚 PageSift 是什么:一个用 Rust 写的网页内容引擎,把杂乱的网页、PDF 和 Office 文档变成干净的 Markdown 和结构化数据,专门给 AI Agent 和 RAG 流水线喂数据。它提供与 Firecrawl、Jina Reader 兼容的 API,自带 MCP 服务器和 Python / Node SDK,单二进制就能自托管。AGPL-3.0 开源,另有商业授权。
从 10 月 29 日到 31 日,0.81 系列连着发了五个版本(0.81.0--0.81.4)。这篇把这一串做个复盘:哪些是真刀真枪的能力变化,哪些只是修修补补,我尽量说清楚。
0.81.0:先承认一个测量错误,再把相关性重做
0.81.0 有两条线。
第一条是定向爬取的相关性判断。 之前我用一个只看 URL 和标题的脚本给抓取质量打分,后来改用"读正文内容"的方式复测,发现旧脚本乐观了 20 多分:在 69 所大学、5 个方向的定向爬取里,真正有用的页面占比是 45--50%,不是之前以为的 70%。问题出在打分方式本身:旧模型数的是页面里出现了几个查询词,通用词反而占了便宜------在大学网站里 department、faculty、research 到处都是,一个别的院系的页面能拿高分;而一个通篇讲签证、对留学生查询只有一个词命中的页面,反而分低。
0.81.0 改成按 facet(切面)打分,所有统计量都从本次爬取自己的页面里在线估计,不预设语料。留出集上 AUC 从 0.789 提升到 0.864(严格口径从 0.859 到 0.915)。
第二条是性能。 用 cachegrind 固定缓存模型做剖析,时间主要花在三件事上:几十万次小内存分配、表格逐单元格上堆存储、一个平方级的标题检查。修法是顺着硬件走:连续内存布局、短字符串内联、按字节段处理、每线程 + NUMA 分片的分配器缓存。转换层的输出与上一版逐字节一致------提速没有偷工减料,这一点我专门做了全量比对。
0.81.1 / 0.81.2:浏览器渲染,学会"见好就收"
很多页面要跑 JavaScript 才有正文,但无脑等渲染很贵:旧路径在一个 JS 空壳、反爬挑战页或永远加载不完的页面上能耗掉 5--18 秒,最后拿到的文本和直接 HTTP 抓的没区别。
0.81.1 把 engine: auto 的浏览器升级改成自适应的:
- 导航、稳定、首内容等时间都用在线分布(均值/方差)跟踪,统计量没把握时不瞎猜,用原有超时兜底;
- 到点后把当前 DOM 过一遍和最终结果相同的正文提取器------如果提取出的正文不比 HTTP 结果更好,立刻停掉浏览器,用 HTTP 文档。导航栏、Cookie 横幅这类噪音不会再被误判成"渲染有收益";
- 耐心程度按硬件相对值算,没有写死的秒数。
269 页的 A2 回放集上:单 worker 从 119.2 秒降到 77.3 秒,16 worker 从 28.4 秒降到 10.5 秒。
0.81.2 修的是 0.81.1 引入的一个内容丢失:有一类页面 HTTP 正文只是一个裸的客户端重定向,目标页要等脚本跑完才有内容,自适应早停会在内容出现之前把浏览器停掉,最后交回一个空壳。0.81.2 对这类页面改成"内容一出现立刻抓取",等待上限由页面自身的 HTTP 耗时和调用方超时决定。A2 回放:相比 0.81.0 的 110.7 秒 / 21.9 秒(1 / 16 worker),0.81.2 是 88.0 秒 / 13.5 秒,总字符数还多了 174,零页面丢内容。说句实话:它比 0.81.1 略慢一点,这是为了零丢失主动换的。
0.81.3:补兼容的窟窿,堵鉴权的窟窿
两个都是"之前不算数"的问题:
includeTags/excludeTags以前只是 API 收了参数不生效,Python SDK 更是直接报错。现在按 CSS 选择器在正文提取前真正过滤:excludeTags 连子树一起删,includeTags 只保留命中的最外层元素。- Jina Reader 兼容路由
/r/之前挂在 API key 中间件外面:服务器就算配了 key,这条路由谁都能用,还不计速率限制和页数配额。0.81.3 把它并入同一套鉴权和计量。这个对以后做托管版是必须先堵的洞。
0.81.4:一次纯粹的安全更新
0.81.4 没有任何新功能,就是把依赖升上去修 4 个 RustSec 漏洞:tokio Interval 的竞态、zstd 在复用上下文时的流数据泄漏、zstd-safe 两个解压内存安全问题。PageSift 用 zstd 解 Content-Encoding: zstd 的响应、也用它压缩存储的 HTML 快照------我没有去论证自己的调用路径是否真的能触达漏洞代码,先升级再说。cargo deny check 全项通过,这个版本不跑新基准,README 里的性能数字都不是新的。
公开基准(仓库 benchmarks.md,持续维护)
- PDF 转 Markdown:2.2 ms/页,对 pypdf 的 50.0 ms,约 22 倍
- HTML 转 Markdown:比 Turndown 快 8.24 倍;正文提取比 crw 快 7.23 倍
- Office 文档吞吐:比 Kreuzberg 快 4.82 倍,峰值内存 38 MB 对 231 MB
- 真实站点爬取覆盖率:0.740,对 Crawl4AI 的 0.529
- PDF 图文识别(olmOCR 口径):0.628,对 pymupdf4llm 的 0.484
- 大规模运行:2 亿任务量级,内存峰值 888 MiB
还没解决的,也写在这里
- 开箱的抓取吞吐看起来保守,主因是默认的礼貌策略:对每个站点默认 1 秒的请求间隔、严格遵守 robots。这是我刻意的取向(配置里可以调),但和一些"速度优先"的爬虫比回放数字,确实吃亏。
- 难 PDF(扫描件、复杂版式)的完成率还落后于带 GPU 的方案,这是结构差距,不是一版能追平的。
下一步:0.9 做性能提升和功能完善,1.0 上托管版。
上手
bash
cargo install pagesift # Rust
pip install pagesift # Python(自带 pagesift-mcp 命令)
npm install pagesift # Node
pagesift scrape https://example.com
给 AI 客户端接 MCP(stdio):
json
{ "command": "uvx", "args": ["--from", "pagesift", "pagesift-mcp"] }
仓库:github.com/YOLOW92/pag... ------觉得有用给个 star,有问题欢迎到仓库或 Discord(仓库 README 里有)拍砖。