note/work/AI/course
2025-11-19 10:16:05 +08:00
..
__pycache__ init 2025-11-19 10:16:05 +08:00
config.py init 2025-11-19 10:16:05 +08:00
example_part_100.json init 2025-11-19 10:16:05 +08:00
example_version_id.json init 2025-11-19 10:16:05 +08:00
OPTIMIZATION_SUMMARY.md init 2025-11-19 10:16:05 +08:00
README.md init 2025-11-19 10:16:05 +08:00
requirements.txt init 2025-11-19 10:16:05 +08:00
scraper.py init 2025-11-19 10:16:05 +08:00
test_hardcoded_values.py init 2025-11-19 10:16:05 +08:00
test_token_config.py init 2025-11-19 10:16:05 +08:00
抓取流程.md init 2025-11-19 10:16:05 +08:00

国家课程资源抓取工具

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

功能特性

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

安装依赖

pip install -r requirements.txt

使用方法

基本用法

1. 解析本地 part 文件并打印版本 ID

python3 scraper.py --part-file example_part_100.json --test

2. 从远程 URL 获取 part 文件

python3 scraper.py --part-url "https://example.com/part_100.json" --test

3. 完整下载流程(需要 token

python3 scraper.py --part-file example_part_100.json --out downloaded --token 'MAC id="...",nonce="...",mac="..."'

4. 使用远程 part 文件并下载

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 文件中集中管理:

# 文件路径配置
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,记录下载详情:

{
  "version_id": "xxx",
  "resources": [
    {
      "url": "https://...",
      "filename": "文件名.pdf",
      "label": "资源标签",
      "status": "ok/error"
    }
  ]
}

高级用法

1. 仅列出资源不下载

python3 scraper.py --part-file example_part_100.json --list-only

2. 限制处理数量

python3 scraper.py --part-file example_part_100.json --limit 5

3. 仅下载PDF文件

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    # 优化总结

测试验证

# 运行测试脚本验证配置
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 - 增强错误处理和日志记录