# py-chan · 缠论《教你炒股票》抓取器

抓取 [kline8.com/chanlun](https://www.kline8.com/chanlun?p=0) 上缠中说禅
《教你炒股票》系列全部 108 课原文，转换为结构化数据，并直接写入 Vue 阅读站
[`D:\code\chan`](../chan)，在 `http://localhost:5173/chanlun` 展示。

> `p=0` 是目录页，`p=1`…`p=108` 依次对应第 1～108 课。

## 依赖

```bash
pip install -r requirements.txt
```

## 使用

```bash
python main.py              # 全量抓取（带缓存，可重复运行）
python main.py --limit 3    # 仅抓前 3 篇，联调测试
python main.py --refresh    # 忽略缓存重新抓取
python main.py --no-images  # 不下载图片，正文保留远程链接
```

## 产物

| 路径 | 说明 |
| --- | --- |
| `data/raw/p001.html …` | 原始 HTML 归档 |
| `data/markdown/ke-001.md …` | 每篇 Markdown 归档 |
| `data/articles.json` | 全量结构化数据 |
| `D:\code\chan\src\data\chanlun.ts` | Vue 数据源（首次运行会自动备份示例为 `chanlun.sample.ts`） |
| `D:\code\chan\public\chanlun-img\…` | 本地化图片 |

## 模块

- `config.py` —— 站点、请求、产物路径等常量
- `fetcher.py` —— 带限速 / 重试 / SSL 回退的 HTTP 抓取
- `parser.py` —— 目录页与文章页解析，产出 `Article` 结构
- `converter.py` —— 正文 HTML → Markdown（含行内样式与图片）
- `writer.py` —— 图片本地化、TS 数据文件、JSON 输出
- `main.py` —— 命令行入口与编排

抓取后到 `D:\code\chan` 运行 `pnpm dev`，访问 `http://localhost:5173/chanlun`
即可看到全部 108 课；点击任意一篇进入沉浸式阅读页。
