risshe92/docprobe
GitHub: risshe92/docprobe
Docprobe 是一款通用文档提取工具,通过自动识别常见文档框架并利用智能回退策略,将动态文档网站归档为本地 Markdown 或 PDF 文件。
Stars: 6 | Forks: 1
# Docprobe
Docprobe 是一个通用的文档提取工具,旨在归档那些不提供可下载版本的现代文档网站。
它会自动检测常见的文档框架,如 Docusaurus、MkDocs、GitBook 和 ReadTheDocs,然后使用智能回退策略提取内容。
## 功能特性
- 自动检测文档平台
- 提取动态 SPA 文档站点
- 工具栏爬取和侧边栏导航发现
- 智能提取回退:Markdown → 文本 → OCR
- 并发爬取
- 恢复中断的爬取任务
- 后处理:按章节标题重命名文件,去除导航样板内容
- PDF 导出支持(分页或单个合并手册)
- 支持针对难处理或图片密集页面的 OCR
- 专为现代 JavaScript 渲染的文档门户设计
## 支持的文档平台
- Docusaurus
- MkDocs
- GitBook
- ReadTheDocs
- 自定义 SPA 文档站点
- PDF 查看器风格的文档页面
- 通过 OCR 回退处理图片密集的文档页面
## 安装说明
**1. 克隆代码仓库**
```
git clone https://github.com/risshe92/docprobe.git
cd docprobe
```
**2. 创建并激活虚拟环境**
```
python3 -m venv venv
source venv/bin/activate
```
**3. 安装 Python 依赖**
```
pip install -r requirements.txt
```
**4. 安装 Playwright 浏览器依赖**
```
playwright install chromium
```
**5. 安装系统依赖**
Debian/Ubuntu:
```
sudo apt install tesseract-ocr pandoc texlive-xetex
```
Arch:
```
sudo pacman -S tesseract pandoc texlive-core
```
## 快速开始
提取单个文档页面:
```
python3 docprobe.py --url https://docs.example.com/docs
```
自动爬取文档侧边栏:
```
python3 docprobe.py --url https://docs.example.com/docs --crawl-toolbar
```
恢复中断的爬取:
```
python3 docprobe.py --url https://docs.example.com/docs --crawl-toolbar --resume
```
将提取的 markdown 页面导出为单独的 PDF:
```
python3 docprobe.py --url https://docs.example.com/docs --crawl-toolbar --export-pdf pdf
```
生成单个合并的 PDF 手册:
```
python3 docprobe.py --url https://docs.example.com/docs --crawl-toolbar --export-pdf pdf-single
```
## 命令行选项
### 爬取选项
| 参数 | 默认值 | 描述 |
|---|---|---|
| `--url` | 必需 | 目标文档 URL |
| `--export-as` | `md` | 输出格式:`md`、`txt`、`html`、`ocr` |
| `-o`, `--output-dir` | `./output//` | 输出目录 |
| `--crawl-toolbar` | 关闭 | 爬取侧边栏/工具栏中的所有链接 |
| `--max-pages` | `0` (无限制) | 限制爬取的页面数量 |
| `--resume` | 关闭 | 跳过已处理的 URL |
| `--concurrency` | `4` | 并发爬取工作线程数 |
| `--export-pdf` | `none` | 爬取后导出为 PDF:`none`、`pdf`、`pdf-single` |
| `--debug` | `off` | 日志级别:`off`、`error`、`info`、`debug` |
### 后处理选项
| 参数 | 描述 |
|---|---|
| `--post-process` | 在现有目录上运行后处理(不进行爬取) |
| `--input-dir` | 要处理的输入目录(与 `--post-process` 配合使用时必需) |
| `--rename` | 使用其第一个标题或页面标题重命名文件 |
| `--clean` | 去除导航样板内容和 frontmatter(仅限 markdown) |
| `--export-pdf` | 处理后导出为 PDF:`pdf`、`pdf-single` |
## 导出格式
`--export-as` 控制爬取期间的输出格式:
| 值 | 输出 |
|---|---|
| `md` | Markdown(默认) |
| `txt` | 纯文本 |
| `html` | 渲染后的 HTML |
| `ocr` | 来自页面截图的 OCR 文本 |
默认情况下,输出会写入 `./output//`,或者如果指定了 `-o` 则写入指定目录。
## 提取策略
使用默认的 `md` 模式时,Docprobe 会分析页面并自动应用回退链:
```
markdown → text → ocr
```
这使得 Docprobe 能够从糟糕的 Markdown 提取中恢复,并仍然捕获难以提取的内容。
## 后处理
后处理在已提取文件的现有目录上运行,无需重新爬取。
按章节标题重命名文件:
```
python3 docprobe.py --post-process --input-dir ./output/md --rename
```
清理 markdown 文件中的导航样板内容:
```
python3 docprobe.py --post-process --input-dir ./output/md --clean
```
重命名、清理,然后导出单个合并的 PDF:
```
python3 docprobe.py --post-process --input-dir ./output/md --rename --clean --export-pdf pdf-single
```
## 输出结构
```
output/
└── md/ # or txt/, html/, ocr/ depending on --export-as
├── 0001_overview.md
├── 0002_getting_started.md
└── ...
meta/
├── run.json
├── crawl_results.json
├── toolbar.json
├── content.json
└── extraction.json
documentation_manual.pdf # if --export-pdf pdf-single was used
```
## 示例命令
单页面,默认 markdown 模式:
```
python3 docprobe.py --url https://docs.example.com/docs
```
并发爬取工具栏:
```
python3 docprobe.py \
--url https://docs.example.com/docs \
--crawl-toolbar \
--concurrency 8 \
--debug info
```
仅爬取前 20 页:
```
python3 docprobe.py \
--url https://docs.example.com/docs \
--crawl-toolbar \
--max-pages 20
```
将输出保存到自定义目录:
```
python3 docprobe.py \
--url https://docs.example.com/docs \
--crawl-toolbar \
-o /home/user/docs_archive
```
恢复之前的爬取:
```
python3 docprobe.py \
--url https://docs.example.com/docs \
--crawl-toolbar \
--resume
```
导出为纯文本:
```
python3 docprobe.py \
--url https://docs.example.com/docs \
--crawl-toolbar \
--export-as txt
```
强制 OCR 模式:
```
python3 docprobe.py \
--url https://docs.example.com/docs \
--crawl-toolbar \
--export-as ocr
```
## 注意事项
- OCR 需要在系统上安装 `tesseract`。
- PDF 导出需要 `pandoc` 和 LaTeX 引擎(`xelatex`)。
- 根据前端复杂程度,某些站点可能需要针对特定站点的调整。
- 对于大规模爬取,最好使用 `--resume` 来处理中断情况。
标签:DNS解析, Docusaurus, GitBook, Markdown转换, MkDocs, OCR识别, PDF导出, Playwright, ReadTheDocs, SPA爬虫, Tesseract, 侧边栏导航, 内容抓取, 动态渲染, 命令控制, 工具栏爬取, 并发爬取, 开源项目, 数据采集, 文档归档, 文档提取, 断点续传, 特征检测, 网络调试, 自动化, 自动检测, 逆向工具, 通用工具