Skip to content

数据源导入与网页抓取

数据源导入是把外部内容搬进知识库的入口集合。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.py BrowserClip);
  • 剪藏一律归网络脑(brain_side = "network"),与个人脑笔记分开管理;
  • 入库后自动打标、向量化,可被融合检索命中、被 AI 问答引用;也支持一键转为知识单元(save-to-knowledge)。

URL / 网页导入

不装扩展也能存网页:在主程序粘贴 URL,服务端抓取正文后建剪藏。

  • 抓取走 readability 路线:_fetch_url_contentdoc.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

抽取口径:

类型抽取机制
PDFpymupdf 提取文字层,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_tagsuser_id/tenant_id 列,按当前空间的标签关联行处理。

为什么不接飞书 / Notion

企业知识库产品(如 WeKnora)的数据源列表里常见飞书、Notion、企业微信等 SaaS 连接器。Molore不接,理由与产品定位一致:

  • 本地优先:SaaS 连接器意味着长期持有第三方平台的访问凭证、把数据通路架在云端 API 上,与「数据不出机器」的定位相悖;
  • 个人场景:个人用户的素材来源是浏览器和本地文件,剪藏 + URL + RSS + 上传已覆盖;团队协作场景由团队空间在库内解决,不需要外部 IM 管道;
  • 可替代路径存在:Notion 等工具的内容可先导出为 Markdown/HTML,再经文档上传或导入通道入库。

下一步

基于 AGPL-3.0 协议发布。