note/work/AI/course/README.md
2025-11-19 10:16:05 +08:00

207 lines
5.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 国家课程资源抓取工具
一个遵循 `抓取流程.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 - 增强错误处理和日志记录