# 国家课程资源抓取工具

一个遵循 `抓取流程.md` 的 Python 爬虫工具，用于从 `part_100.json` 提取 `version_id`，获取详细 JSON 信息，提取 PDF 和 m3u8 URL，并下载相关资源。

## 功能特性

- ✅ 支持本地和远程 part JSON 文件
- ✅ 自动提取版本 ID 和资源信息
- ✅ 支持 PDF 和 m3u8 视频资源下载
- ✅ 智能文件名清理和中文支持
- ✅ 层次化目录结构组织
- ✅ 详细的清单文件记录
- ✅ Token 认证支持
- ✅ 可配置的默认参数

## 安装依赖

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

## 使用方法

### 基本用法

#### 1. 解析本地 part 文件并打印版本 ID
```bash
python3 scraper.py --part-file example_part_100.json --test
```

#### 2. 从远程 URL 获取 part 文件
```bash
python3 scraper.py --part-url "https://example.com/part_100.json" --test
```

#### 3. 完整下载流程（需要 token）
```bash
python3 scraper.py --part-file example_part_100.json --out downloaded --token 'MAC id="...",nonce="...",mac="..."'
```

#### 4. 使用远程 part 文件并下载
```bash
python3 scraper.py --part-url "https://example.com/part_100.json" --out downloaded --token "your-token"
```

### 命令行参数

| 参数 | 说明 | 默认值 |
|------|------|--------|
| `--part-file` | 本地 part JSON 文件路径 | `example_part_100.json` |
| `--part-url` | 远程 part JSON 文件 URL | `None` |
| `--out` | 输出目录 | `downloaded` |
| `--token` | X-Nd-Auth header 值 | `None` |
| `--list-only` | 仅列出资源不下载 | `False` |
| `--limit` | 处理版本ID数量限制 | `0` (无限制) |
| `--only-pdf` | 仅下载PDF文件 | `False` |
| `--test` | 仅测试解析不下载 | `False` |
| `--flat-structure` | 使用扁平目录结构 | `False` |

### 配置说明

所有配置参数都在 `config.py` 文件中集中管理：

```python
# 文件路径配置
DEFAULT_PART_FILE = "example_part_100.json"
DEFAULT_OUTPUT_DIR = "downloaded"

# API 端点配置
DETAIL_BASE_URL = "https://s-file-2.ykt.cbern.com.cn/zxx/ndrv2/national_lesson/resources/details"

# 默认值配置
DEFAULT_MATERIAL_NAME = "未知教材"
DEFAULT_CHAPTER_NAME = "未知章节"
DEFAULT_COURSE_TITLE = "未知课程"
DEFAULT_FILENAME = "unnamed"

# 认证配置
DEFAULT_TOKEN = None  # 设置您的默认 token

# 其他配置...
```

## 输出结构

### 层次化目录结构（默认）
```
downloaded/
├── 教材名称/
│   ├── 章节名称/
│   │   ├── 课程名称_version后6位/
│   │   │   ├── 资源文件.pdf
│   │   │   ├── 资源文件.m3u8
│   │   │   └── manifest.json
│   │   └── ...
│   └── ...
└── manifest_all.json
```

### 扁平目录结构（使用 --flat-structure）
```
downloaded/
├── version_id_1/
│   ├── 资源文件.pdf
│   ├── 资源文件.m3u8
│   └── manifest.json
├── version_id_2/
│   └── ...
└── manifest_all.json
```

## 配置文件说明

### config.py
包含所有可配置参数，便于集中管理：
- 文件路径和URL配置
- 默认值和限制设置
- 网络超时和块大小
- 认证token配置

### 清单文件
每个版本目录包含 `manifest.json`，记录下载详情：
```json
{
  "version_id": "xxx",
  "resources": [
    {
      "url": "https://...",
      "filename": "文件名.pdf",
      "label": "资源标签",
      "status": "ok/error"
    }
  ]
}
```

## 高级用法

### 1. 仅列出资源不下载
```bash
python3 scraper.py --part-file example_part_100.json --list-only
```

### 2. 限制处理数量
```bash
python3 scraper.py --part-file example_part_100.json --limit 5
```

### 3. 仅下载PDF文件
```bash
python3 scraper.py --part-file example_part_100.json --only-pdf
```

### 4. 使用自定义配置
修改 `config.py` 文件中的配置项，然后正常运行程序。

## 错误处理

- 网络请求失败会自动重试并记录错误
- 文件下载失败会在manifest中标记状态
- 文件名冲突会自动添加序号解决
- 支持请求超时和重试机制

## 开发说明

### 项目结构
```
.
├── scraper.py          # 主程序
├── config.py           # 配置文件
├── requirements.txt    # 依赖文件
├── example_part_100.json      # 示例part文件
├── example_version_id.json    # 示例版本文件
├── test_hardcoded_values.py   # 测试脚本
└── OPTIMIZATION_SUMMARY.md    # 优化总结
```

### 测试验证
```bash
# 运行测试脚本验证配置
python3 test_hardcoded_values.py

# 测试基本功能
python3 scraper.py --test
```

## 注意事项

1. 确保网络连接正常，特别是访问远程资源时
2. 如需认证，请正确配置 token 参数
3. 输出目录需要有写入权限
4. 大文件下载请确保磁盘空间充足
5. 建议使用稳定的网络环境

## 技术支持

如有问题请参考：
- `抓取流程.md` - 详细的操作流程说明
- `OPTIMIZATION_SUMMARY.md` - 代码优化说明
- 配置文件中的注释说明

## 版本历史

- v1.0 - 初始版本，支持基本抓取功能
- v1.1 - 优化硬编码值，增加配置管理
- v1.2 - 增强错误处理和日志记录
