知乎爬虫——ZhiZhu项目分析
简介
ZhiZhu (知蛛) ——爬取指定知乎用户的所有回答和所有文章,以高保真 Markdown 格式保存到本地。
“我们在互联网上留下的每一个字节,都是灵魂的碎片。是时候把它们找回来了。”
为什么是 ZhiZhu?
多年来,你在知乎上敲下的数万、数十万字,不仅仅是简单的问答。它们是你知识体系的疆界,是你价值观的投影,是你逻辑思维的演变轨迹,更是你在这个喧嚣世界中发出的独特声音。
然而,散落在互联网角落的数据是脆弱的,也是割裂的。
ZhiZhu (知蛛) 是一台时光穿梭机,也是一位数字考古学家。它致力于将你流落在知乎的精神财富,以最纯粹、最通用的 Markdown 格式完整带回本地。无论是精妙的 LaTeX 数学公式,还是承载记忆的图片,都力求高保真还原。
Archiving the past to compute the future.
归档过去,为了计算未来。
在 AI 时代,这不仅仅是备份
当你拥有了这份属于自己的全量数据,你就拥有了训练私人 AI 助理的基石。你可以将这些代表你 “人格(Personality)” 的文本投喂给 LLM,让 AI 成为你的镜子——
- 自我复盘 — 利用 AI 分析你过去数年的回答,生成你的「认知演变报告」
- 知识图谱 — 从散乱的回答中提取你的知识结构,重组为系统化的文章
- 风格克隆 — 让 AI 学习你的文风与逻辑,成为最懂你的写作助手
- 深度对话 — 与你的「数字孪生」对话,完成一次深度的自我探索与反省
把数据存成 Markdown,只是第一步;认识你自己,才是 ZhiZhu 的终极目标。
Don’t just leave it on the cloud. Own your thoughts.
别把思想只留在云端,拥有它。
核心能力
| 能力 | 说明 |
|---|---|
| 用户级全量爬取 | 输入用户 URL token,自动收集该用户的全部回答与文章 |
| 用户想法爬取 | 爬取指定用户的所有知乎想法(Pins) |
| 问题级爬取 | 爬取指定问题下的全部或前 N 个回答 |
| 单回答爬取 | 精准爬取某个特定回答,可选附带完整评论区 |
| 评论区提取 | 通过知乎 API 获取全部根评论与子评论,格式化为 Markdown |
| 浏览器指纹伪装 | 内置 WebGL、Canvas、AudioContext 等多维度反检测机制 |
| 智能延迟策略 | 请求间随机等待 10-20 秒(可自定义),以时间换安全 |
| 断点续传 | 自动记录进度,中断后重新运行即从上次位置继续 |
| LaTeX 公式还原 | 完美转换知乎数学公式为标准 $...$ / $$...$$ 语法 |
| 图片本地化 | 自动下载文章图片到本地,重写 Markdown 引用路径 |
| 内容去噪 | 自动去除广告卡片、视频占位符、知乎直答链接等干扰元素 |
| 持久化登录 | 登录一次,后续爬取无需重复登录 |
重要代码分析
main.py中argparse参数解析
| |
| |
webui.py中的通用流式日志生成器
将 fn() 产生的所有 print() 输出实时 yield 给 Gradio Textbox。
| |
tui.py中的终端交互
提供基于 Textual 的 TUI 界面,覆盖 ZhiZhu 的全部功能。
不同面板对应不同的功能,使用stdout 重定向输出日志。
| |
merge_md.py中的文本预处理
| |
stealth.py — 反检测 JavaScript 注入模块
参考 hg3386628/zhihu-scraper 和 yuchenzhu-research/zhihu-scraper 的反爬策略。
集成 WebGL、Canvas、AudioContext 指纹伪装以及 navigator.webdriver 覆盖。
| |
scraper.py — 知乎内容爬虫核心模块
功能:
- 使用 Playwright 持久化上下文登录知乎(手动登录,保存 Cookie)
- 爬取指定用户的所有回答和文章链接
- 爬取指定用户的所有想法(Pins)
- 爬取指定问题下的所有(或前 N 个)回答
- 爬取单个回答,可选附带评论区
- 逐个访问并提取内容,转为 Markdown 保存
- 内置反检测(stealth JS 注入、指纹伪装)
- 请求间隔随机延迟,降低被封风险
浏览器上下文管理
| |
爬取回答对应的URL
| |
处理评论
| |
断点续传功能实现
| |
| |
converter.py——HTML → Markdown 转换模块
处理知乎特有的 LaTeX 公式、代码块、图片链接重写、垃圾内容清洗。
核心策略:在 BeautifulSoup 阶段用占位符保护公式,markdownify 转换后再还原为 $ / $$ 定界符。
参考 yuchenzhu-research/zhihu-scraper 的 converter.py 实现。
清理噪音(知乎直达)
| |
| |