Skip to content

Commit d4673f1

Browse files
committed
docs(Foresight): web 采集进料管道调研定案(三件套/kind=web/内核先行)
1 parent 1e9db22 commit d4673f1

1 file changed

Lines changed: 124 additions & 0 deletions

File tree

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
# 前瞻调研:Web 采集——第三条进料管道(机制定案,未立项)
2+
3+
> 状态:前瞻调研 + 讨论定案(2026-09-05;**未立项,待登记 REQ 候选**)——回答"熵减要不要做 web 采集、用什么机制做",承接 v0.10.0 舍弃清单 #26(网页剪藏)的翻案论证
4+
> 结论先行:**有条件翻案**——不做"网页收集中枢",做**第三条进料管道**(实时捕获 / 图文采集之外),只服务"网页素材进入学习闭环";机制=**浏览器扩展前哨(登录态 DOM)→ 本地 loopback 收件服务 → 应用内解析入库**三件套;落点=`kind=web` 会话复用既有摄入脊柱;落地=**内核先行**(先应用内 URL 采集静态闭环,扩展后置为薄壳复用同一 POST 契约)
5+
> 研究路数:GitHub 现成项目盘点(抽取引擎/快照/完整项目架构)→ 中文+全球市场调研 → 本地架构参照(ADR-020 kind / ADR-021 正文源多态)→ 机制定案。检索时间 2026-09-05;价格为写稿时点以官网为准。
6+
7+
## 一、翻案论证:回应 v0.10.0 舍弃 #26
8+
9+
**原裁决**([v0.10.0 舍弃清单 #26](../versions/v0.10.0.md)):网页剪藏(对标印象笔记)——"产品定位为视频学习提取,非网页收集中枢"。
10+
11+
**2026-09 三个变化支撑有条件翻案**:
12+
13+
1. **学习素材外延已扩大**:8 类内容体系(W 事实 / Y 因果 / H 程序 / M 模型 / Me 洞见 / Act 行动 / SE 状态 / AI 审美)讨论中,原则/效应/洞见类素材大量来自**文章与文档**而非视频;图文采集动线(v0.11.7)已事实上承认"网页是学习场景"——但其产出是截图+OCR 识别文本,质量劣于正文直取(版式噪声、错字、无法检索原句)。
14+
2. **架构地基已预留**:ADR-021 `BodySource` 正文源多态明确预留"新正文源只加变体";photo 会话先例证明"无音频会话"可行(ADR-020 kind 字段)。
15+
3. **市场窗口出现**:云端稍后读大清洗(Pocket 2025 关停删库、Omnivore 2024.11 被购停服、收趣 2025 停服清库、Evernote 式微),本地优先 + 开放格式从口号变为抗关停卖点;Obsidian Web Clipper(官方、MIT、2024.11 开源)成为开源剪藏事实标准——"扩展读已登录 DOM → 本地 MD"范式成熟。
16+
17+
**克制表述(定位红线)**:web 采集不做收藏夹、不做通用稍后读、不承诺全站适配——**素材进学习闭环(正文直达笔记管线 → 组 → 闪卡/检索)即止**。剪藏与"课程采集"同权但不同形:课程是容器地形(结构在内容里,产物=课程笔记),文章按主题归组(feed 地形碎片同权,产物=组内素材/笔记),沿用"组是唯一容器、进料方式养同一个叙事"哲学(product-design-philosophy §3.2)。
18+
19+
## 二、GitHub 盘点:可复用零件(几乎不自研)
20+
21+
### 抽取引擎
22+
| 候选 | 语言/许可 | 状态 | 判定 |
23+
|---|---|---|---|
24+
| **mozilla/readability** | JS / Apache-2.0 | 11.4k★,push 2026-08;Firefox 阅读模式同源 | **主线**:在扩展内 / wry WebView 内执行 |
25+
| kumabook/readability(crate) | Rust / MIT | 134★,v0.3.0,下载 140 万,维护放缓(push 2024-04) | 仅静态页降级路径 |
26+
| trafilatura | Python / Apache-2.0 | 6.8k★,PyPI 2.2.0(2026-07) | 论文级基准最强;lxml 打包重 → **只作离线验收基准数据集**,不嵌入 |
27+
| turndown(HTML→MD) | JS / MIT | 11.4k★,最活跃 | 随 readability 注入 |
28+
| scraper + ammonia + mdka-rs | ISC / Apache-2.0 | — | Rust 侧消毒/解析闭环可行(html2md crate 为 GPL-3.0+ 勿用;kuchiki 已归档) |
29+
30+
### 整页快照
31+
- **WebView2 无 MHTML savePage API、无法跑无头 Chromium → 渲染型快照唯一现实路径**:隐藏 wry 窗口加载目标页 → 注入自研 DOM+子资源内联 JS(SingleFile 同思路,但其 AGPL-3.0 需规避,自研 core.js)
32+
- monolith:Rust / CC0-1.0 / 15.5k★ / crate v2.10.1 可嵌入 —— 静态快照降级路径
33+
- 截图仅视口、wget -p 仅静态 —— 均不足
34+
35+
### 完整项目架构先例(采集机制范式)
36+
| 项目 | 许可 | 机制一句话 | 借鉴点 |
37+
|---|---|---|---|
38+
| **Joplin Web Clipper** | AGPL-3.0 | 桌面 loopback REST `127.0.0.1:41184`+`?token=`;扩展 POST /notes(MD 或 body_html+image_data_url) | **本地收件服务范式最完整**:端口探测 GET /ping(试 41184-41194 解决端口冲突/未启动) |
39+
| 思源 siyuan-chrome | AGPL-3.0 | 扩展调本地内核 `127.0.0.1:6806`+授权码 → createDocWithMd,图落本地 assets | 授权码+图落盘 |
40+
| **Obsidian Web Clipper** | MIT / 5.1k★ | 扩展内 Readability+Turndown 全量转换 → `obsidian://` URI → 桌面端写 vault;超长/未开应用落剪贴板 | **登录墙正解示范**(读已渲染 DOM);模板化 MD(表/码/脚注) |
41+
| Omnivore(停运) | AGPL-3.0 | 扩展在已登录页内抽取内容直接 POST 服务器,绕开服务端 fetch | 客户端抽取派典范(付费墙可全取) |
42+
| ArchiveBox | MIT | 扩展复用 admin 会话只投 URL;服务端 chromium 多提取器(WARC/PDF/single-file/yt-dlp);cookie 导入 + persona(chromium profile) | 登录墙的第二条路:cookie/profile 复用(重,备用) |
43+
| Karakeep(原 Hoarder)/ Linkwarden / wallabag | AGPL / MIT | 服务端 fetch 派(Readability / Graby / 截图) | 反例:无登录态,公众号/付费墙基本失效 |
44+
| **LLM Wiki**(Tauri v2) | — / 17.4k★ | Web Clipper + URL 批量入库 + Rust clip_server | Tauri 2 最大直接先例 |
45+
46+
### 安全边界(AGENTS.md 红线对齐)
47+
只绑 127.0.0.1 + 首启随机 token(UI 展示)+ 单向"投递"权限 + CORS 拒绝非扩展 origin;图/资源落盘限定应用数据目录;长度/类型校验。
48+
49+
## 三、市场调研结论(中文 + 全球)
50+
51+
### 特征矩阵要点
52+
| 产品 | 定位 | 关键信号 |
53+
|---|---|---|
54+
| Readwise Reader | 云端标杆 ≈$10/月 | 剪藏只是通道,**高亮+API+笔记回流才是粘性**;抽取强但 JS 重页偶残;Ghostreader 单篇摘要口碑平平 |
55+
| Pocket(停运)/ Omnivore(停运)/ 收趣(停运) | 云端稍后读 | **命不由己**:关停只给两周导出、限期清库——"数据不出机"叙事的最佳广告 |
56+
| Cubox | 中文云端闭环 | 多渠道(扩展/微信转发)+ 快照兜底 + AI 解读;Pro 年订阅;微信助手接口受制第三方 |
57+
| 简悦 SimpRead | 中文扩展 | 本地为主 + 一次性买断 + 插件接各笔记库;抽取质量靠个人长期堆站点适配 |
58+
| 语雀/印象笔记/有道 | 生态配件 | 剪藏非主线即失修;专有格式困住迁移 |
59+
| **Obsidian Web Clipper** | 开源事实标准(MIT) | 免费 + 本地 MD + JSON 导出 + 登录态直剪(公众号/知乎场景佳) |
60+
| Joplin Clipper | 开源(AGPL) | 简化 MD+截图,需本地服务 |
61+
| Firecrawl / Jina Reader | API 型 | URL→MD 已服务化;全文经第三方 → 熵减不可默认依赖(Firecrawl 可自托管;Jina 有本地 ReaderLM 1.5b 模型) |
62+
63+
### 2025-2026 趋势
64+
1. **云端稍后读大清洗**:幸存者分化为"AI 体验派"与"本地优先开源派"两极;开源化=信任叙事(MD 可迁移 + 自托管对冲停服焦虑)。
65+
2. **AI 从单篇摘要转向带引用、可溯源的库级问答**(NotebookLM 范式),采集管道前置化。
66+
3. **"剪藏直通笔记/闪卡"是防吃灰共识**:收藏即终点 = 收藏夹;闭环 = 学习工具。
67+
68+
### 空白登记(远期路线,不在本次范围)
69+
视频课程/字幕级网页剪藏无人做好(Cubox 的 B 站字幕至今是未落地 feature request)——与熵减"视频知识提取"定位直接互补;留待 `kind=web` 会话模型成熟后按同模型扩展(正文源=字幕直采),不新造脊柱。
70+
71+
## 四、机制定案:三件套架构
72+
73+
```
74+
浏览器扩展(前哨) 桌面应用(Rust 主进程)
75+
┌────────────────────┐ ┌────────────────────────────────┐
76+
│ 已登录 DOM 上下文 │ POST │ ① 本地收件服务 axum/tiny-http │
77+
│ readability+turndown │ ─────→ │ 绑 127.0.0.1 随机端口+token │
78+
│ → MD + 元数据 + 原HTML│ │ /ping 端口探测(Joplin 范式) │
79+
└────────────────────┘ │ ② 解析入库:MD → kind=web 会话 │
80+
│ 图 base64/URL → 落盘+改写引用 │
81+
│ ③ 快照:隐藏 wry 窗口注入 DOM 内联 JS │
82+
│ 降级:monolith(静态) → 截图 │
83+
└────────────────────────────────┘
84+
```
85+
86+
**五条分叉裁决**:
87+
88+
| # | 分叉 | 裁决 | 一句话依据 |
89+
|---|---|---|---|
90+
| 1 | 产品定位 | 有条件翻案 #26(进料管道,非收集中枢) | 素材外延扩大 + 架构预留 + 市场窗口 |
91+
| 2 | 实现机制 | 扩展前哨 + loopback 收件 + 应用内解析 | 登录墙靠扩展用户态;全文不经第三方;本地优先红线兼容 |
92+
| 3 | 会话模型 | **`kind=web` 会话** + `BodySource::Web` 变体 | photo 先例 + ADR-021 预留位;避免第二套容器 |
93+
| 4 | 落地顺序 | **内核先行**:URL 采集静态闭环 → 扩展薄壳(同一 POST 契约)→ 快照/AI 殿后 | 摄入协议只设计一次,扩展零返工 |
94+
| 5 | 入口形态 | 课堂助手动线区单入口(第四条动线「URL 采集」) | 产物统一进会话列表;扩展投递无感同列 |
95+
96+
**SPA/动态站缺口**:阶段 1 reqwest 静态管线不覆盖 JS 渲染站——由阶段 2 扩展(读已渲染 DOM)自然补齐,无需 WebView 抓取前置。
97+
98+
## 五、阶段路线
99+
100+
- **阶段 1 · 内核(应用内 URL 采集)**:粘贴 URL → Rust fetch → 静态抽取(scraper+readability crate+ammonia+mdka-rs 或 WebView 注入 readability)→ `kind=web` 会话草稿(正文 MD + 元数据 + 标题层级)→ 转笔记链路复用
101+
- **阶段 2 · 扩展薄壳**:Chromium/Firefox 扩展(扩展内 readability+turndown → POST 本地服务);覆盖公众号/知乎/付费墙/SPA;图 base64 随投,落盘 `session-images/`
102+
- **阶段 3 · 快照与 AI**:隐藏 wry 窗口 DOM 内联快照(自研,规避 SingleFile AGPL);monolith 静态降级;AI 摘要/带引文问答作可选增强(复用 AiSettings 闸门,本地规则默认,不绑订阅)
103+
104+
**兜底链**:正文抽取失败 → 保留原 HTML 附件;快照失败 → 截图(图文动线兜底);扩展缺失 → URL 采集仍可用(登录墙内容除外);离线不可达 → 错误提示不产生半成品会话。
105+
106+
## 六、与笔记管线衔接(8 类体系语境)
107+
108+
- **预处理**:抽取即净化(外来内容预处理最重一步由机器完成);正文以"整篇初稿 + 标题层级结构线索"形态入库——**可逆**(可随时再切块),原子化拆解与 8 类精细分类留给核心处理阶段,两阶段不互相阻塞
109+
- **来源留痕**:URL/站点名/作者/抓取时间进 notes.properties 扩展位(v0.10.0 预留),对齐"元数据 + MD/JSON 可迁移导出"基础契约
110+
- **回链语义**:段落→来源回链从"时间戳锚点"变为"标题锚点"(点段落跳原文对应标题处)
111+
- **闭环**:正文 → 转笔记 → 归组 → 检索/闪卡——剪藏不独立成"收藏区",对抗"收藏即吃灰"
112+
113+
## 七、风险与开放项
114+
115+
1. 扩展商店发布(Edge/Chrome/Firefox 三店)周期与审核不确定性 → 阶段 2 前置评估
116+
2. 抽取质量缺少本机验收口径 → 以 trafilatura 建离线基准数据集(仅验收用,不嵌入产品)
117+
3. 反爬/站点结构变动 → 不做全站承诺;失败走兜底链,不给用户"剪坏了"的体验
118+
4. 协议契约(MD+元数据+图 base64)需在阶段 1 定义时就留扩展字段位(source=extension/url 等),防阶段 2 返工
119+
5. 安全审计:token 展示/轮换、loopback 绑定、CORS、长度校验——与 AGENTS.md Tauri IPC 校验红线一致
120+
121+
## 参考来源
122+
123+
- GitHub:mozilla/readability、kumabook/readability、trafilatura、turndown、SingleFile、monolith、Joplin(REST API 文档/AGPL 公告)、siyuan-chrome、Obsidian Web Clipper(obsidian.md/blog/save-the-web、github.com/obsidianmd/obsidian-clipper)、ArchiveBox docs、Karakeep docs、Linkwarden docs、Omnivore(github.com/omnivore-app/omnivore)、LLM Wiki(github.com/nashsu/llm_wiki)、zedi(issue #339)、mdSilo、tauri#5441 / PR#14925(wry eval_with_callback)
124+
- 市场:TechCrunch(Pocket 关停)、DEV 2026 RIL 对比与 Reader/ Raindrop 评测、Obsidian 官方剪藏博客、Joplin clipper 文档、Firecrawl 定价页、jina-ai/reader + ReaderLM-1.5b(HuggingFace)、NotebookLM 官方博客、简悦官网/定价/issue #4472、Cubox help/Pro 规则/微信助手公告、收趣停运公告、语雀剪藏官方、有道服务公告、思源小书签(ld246)、SiYuanWebClipper(AMO)、Obsidian Clipper 中文解读(blog.iaieye.com)、飞书剪存帮助、小红书第三方导出(xhs-favorites-exporter)

0 commit comments

Comments
 (0)