Awesome Tech Share 重构失败记录
序言 注意:本篇文章经过AI润色 Awesome Tech Share是一个基于 MkDocs 的静态知识库,通过 GitHub Actions 自动化部署,涵盖 AI、CS、开发、学习成长等多个领域,内部积累了相当数量的 Markdown 文件,每篇文件里都手工嵌入了大量外部 URL。 随着文件数量的增长,手动整理的成本开始以指数级上升。于是我试图构建一个"URL 驱动的、可自我生长的知识录入系统":输入一个 URL,程序自动抓取、提取、分类,并将内容以 Markdown 的形式写入知识库,最终通过 MkDocs 重新生成静态网站。 一 项目起盘 项目的初始设计围绕四个模块展开。 解析层(spider.py) 负责接收 URL 并抓取原始网页内容。 语义处理层(brain.py) 接入大语言模型,对抓取内容进行摘要提取,并与现有的知识树进行语义对齐,决定内容应写入哪个具体的 .md 文件。 配置更新层(mkdocs_updater.py) 使用 ruamel.yaml 来安全修改 mkdocs.yml 的 nav 导航结构,确保新生成的内容能够在前端正确挂载。最后,一个 主流程脚本(grow_knowledge.py) 将三者串联,提供 CLI 入口,并支持 --dry-run、--url-file、--rebuild-from-docs 等操作模式。 二 爬虫选型:错误的决策 在整个项目中,爬虫层是第一个暴露出深层问题的地方,也是最容易被轻视的地方。 Python 爬虫工具的演进与现实处境 在 Python 生态中,爬虫工具的演进大致经历了三个阶段,每一代工具都在解决上一代的核心瓶颈,但也带来了新的复杂度。 最早一代是以 requests + BeautifulSoup 为代表的静态解析方案。它的优点是极轻量、可控性强,但面对任何 JavaScript 渲染的页面就完全失效。现代互联网中,大量内容(包括技术博客、论文索引页、GitHub 项目页)都依赖客户端渲染,这使得静态解析在实际场景中的覆盖率非常有限。 第二代是以 Scrapy 为代表的工程化框架。它引入了 Spider、Pipeline、Middleware 的分层概念,适合大规模结构化抓取任务。但 Scrapy 的核心设计是面向"批量同质化数据"的,对于 URL 来源极度杂乱、目标网站千差万别的场景,Scrapy 的配置复杂度远超收益。与此同时,Scrapy 对 JavaScript 渲染的支持依赖第三方中间件(如 scrapy-playwright),集成成本不低。 ...