数据源导入与网页抓取
数据源导入是把外部内容搬进知识库的入口集合。Molore是本地优先的个人知识库,导入通道围绕「个人在网页和文件上读到的东西」设计:浏览器剪藏、URL 网页导入、RSS 订阅、文档上传,外加整机数据的导出/导入。所有通道入库后走同一条后处理链:自动打标签 → 向量化 → 进入融合检索与 AI 问答的取材范围。本页逐通道说明机制与边界,并给出与企业知识库产品(如 WeKnora)在数据源选型上的差异理由。
导入通道总览
| 通道 | 来源 | 入库形态 | 落点 |
|---|---|---|---|
| 浏览器剪藏扩展 | Chrome 系浏览器,整页或选中内容 | 剪藏条目(标题/正文/出处/截图) | 网络脑 |
| URL / 网页导入 | 单个 URL | 服务端 readability 抓取正文后建剪藏 | 网络脑 |
| RSS 订阅 | feed 源定时抓取 | 条目列表,可存为剪藏(含 AI 摘要) | 网络脑 |
| 文档上传 | 本地文件 | 文档条目(抽取文本层 + 表格结构化) | 按上传时空间 |
| 导出/导入 | 整机 JSON 数据包 | 全量内容行合并入库 | 强制落当前空间 |
浏览器剪藏扩展
Chrome 扩展(Manifest V3),一键把网页存进知识库,见浏览器剪藏扩展(用户指南)。
- 三种触发:扩展弹窗「剪藏当前页面」、页面右键「剪藏此页到Molore」、选中文字右键「剪藏选中内容到Molore」(只存选中部分);
- 剪藏记录字段含标题、URL、域名、正文全文(
full_text)、摘要(excerpt)与页面截图(screenshot_url)——正文与截图共同构成该页的快照,原网页日后改动或失效,库内仍保留剪藏时刻的内容(模型定义app/models/content.pyBrowserClip); - 剪藏一律归网络脑(
brain_side = "network"),与个人脑笔记分开管理; - 入库后自动打标、向量化,可被融合检索命中、被 AI 问答引用;也支持一键转为知识单元(
save-to-knowledge)。
URL / 网页导入
不装扩展也能存网页:在主程序粘贴 URL,服务端抓取正文后建剪藏。
- 抓取走 readability 路线:
_fetch_url_content用doc.summary()取正文并剥标签为纯文本,不设长度上限(5 万字墙已拆),代码位置app/api/v1/endpoints/clips.py; - 另有
/fetch-metadata提取标题、作者、发布日期等元数据; - 抓取失败(反爬、需登录的页面)时不落假内容,按错误提示处理。
RSS 订阅
RSS 把「主动追更」变成「自动入库」,服务层在 app/services/rss_service.py,定时调度在 app/services/rss_scheduler.py。
- 全文抓取:解析时优先读
content:encoded全文,feed 只给几十字 description 摘要的源也能拿到正文(parse_feed); - AI 摘要落库:条目保存为剪藏时,页面上已生成的 AI 摘要随包落库(
ai_summary字段,上限 2000 字),未生成则回落 feed 自带摘要;自动生成链路只走本地模型(qwen3.5:0.8b),零成本、绝不自动扣费; - 支持手动「立即抓取」(
/sources/{id}/fetch)与按源配置自动抓取(/sources/{id}/auto-fetch); - 抓取失败会在源上记录
fetch_status/fetch_error,列表页可见,不静默吞错。
文档上传
支持格式(app/services/document_service.py ALLOWED_EXTENSIONS):
- 文本类:
.txt.md.markdown.html.htm - 办公文档:
.pdf.docx.xlsx.xls.pptx - 图片:
.jpg.jpeg.png.webp.bmp
抽取口径:
| 类型 | 抽取机制 |
|---|---|
pymupdf 提取文字层,find_tables() 做表格结构化;扫描件文字层不足的页走 RapidOCR(文字层优先,OCR 兜底) | |
| 图片 | 无文字层,一律后台 OCR |
| XLSX / DOCX | 表格转 Markdown 管道表:XLSX 每工作表带「## 工作表:」前缀、单元格批注内联;DOCX 按 body 顺序遍历段落与表格 |
| 全部 | 抽取出的表格行同时进入 row:: 结构化索引(带章节与列名),供枚举/整表类问题直查 |
存量回填:老库中早于管道表抽取的 XLSX/DOCX,启动时由 backfill_md_table_documents 一次性回填(marker extract_md_tables_v1,有差异才更新并同步重建 FTS 与向量)。
文本类文档入库后可在线编辑 title/content(改的是 content_text 文本层,原始上传文件不动),内容变更自动重走 FTS → 向量 → 打标链。
导出/导入与空间口径
整机导出/导入在 app/services/data_transfer_service.py,空间(tenant)口径是硬约束:
- 导出与主列表同口径:个人空间只导本人
tenant_id为空的行,团队空间导整租户内容,双向硬隔离互不夹带; - 导入强制落当前空间:
import_user_data对每行覆写tenant_id(团队空间落租户 id,个人空间落空),不存在「导入的数据漂到另一个空间」的路径; - 同名/同 id 冲突按既有合并规则处理;
content_tags无user_id/tenant_id列,按当前空间的标签关联行处理。
为什么不接飞书 / Notion
企业知识库产品(如 WeKnora)的数据源列表里常见飞书、Notion、企业微信等 SaaS 连接器。Molore不接,理由与产品定位一致:
- 本地优先:SaaS 连接器意味着长期持有第三方平台的访问凭证、把数据通路架在云端 API 上,与「数据不出机器」的定位相悖;
- 个人场景:个人用户的素材来源是浏览器和本地文件,剪藏 + URL + RSS + 上传已覆盖;团队协作场景由团队空间在库内解决,不需要外部 IM 管道;
- 可替代路径存在:Notion 等工具的内容可先导出为 Markdown/HTML,再经文档上传或导入通道入库。
下一步
- AI 对话与会话体验:导入的内容如何被检索与引用
- 端到端加密云同步:入库数据的多端备份与恢复
- 浏览器剪藏扩展(用户指南):安装与配置
- 快速开始:从零建起第一个知识库