一个 Python 命令行工具,用于浏览并批量下载 BBC Learning English 各栏目的音频与文稿(Transcript / Worksheet)。覆盖站点上数十个栏目,每期节目存放在「栏目名 / 期号_标题」的独立文件夹中,方便离线听读、跟读与做笔记。
仅供个人英语学习使用,详见免责声明。
- 多栏目:内置 40 个已核实栏目,并在启动时抓取站点 A-Z 索引动态补全(合计 60+ 个栏目可选),如 6 Minute English、The English We Speak、Learning English from the News、English in a Minute、Learning English Grammar、Office English、The Listening Room、Our World in English、Real Easy English、Stories 等。
- 自动聚合归档页:一个栏目的
_YYYY年份归档与无年份滚动归档会一并抓取去重;选「全部年份」时还会顺着页面上出现的年份归档链接逐年往前深挖(每个栏目最多 12 个归档页),无需手工翻页。 - 真实直链优先:解析每期页面的下载区块拿到官方
Download Audio / Download PDF / Download Transcript地址;解析不到时才按 BBC 命名规律向下载站做 HEAD 探测兜底。 - 官方 Podcast 兜底音频:页面没有音频直链时,自动到 BBC 官方播客(站内公开的无 DRM MP3)里找同名同期的一集下载,来源写进
info.json的audio_source;--podcast off可关闭,详见音频兜底。 - 文字稿三条路线:官方 Transcript / PDF 直接下载;BBC 多数栏目把文字稿写在网页正文里,自动切出并保存为
transcript.txt;只有当页面没有给出任何官方 PDF 时才调用本地 Chrome 的 Print 能力,把正文排版成 A4 无页边距 PDF(避免与下载的 PDF 内容重复,需要时用--transcript print强制)。 - 按栏目分目录保存:下载根目录下先按栏目名建子目录(如
6 Minute English/、The English We Speak/),再在其下为每期建独立文件夹;解析不到栏目时归入Unsorted/。 - 视频按直链处理:页面若提供官方 MP4 直链则默认一并下载(无需额外参数,
--video off可跳过);BBC Learning English 的节目视频目前一律只挂在受保护播放器里,工具会明确告知媒体编号与在线观看地址,详见关于视频。 - 交互式复选框 TUI 选择界面:方向键移动、
Space勾选、Enter确认、Q取消、←/→翻页、PgUp/PgDn跳首末页;非交互式终端自动降级为纯文本序号输入(支持1,3/2-6/a)。 - 额外保存
info.json元数据,便于导入 Anki / 阅读器 / 脚本二次处理。 - 支持断点续传、失败重试、限速间隔,内置
rich进度条。
站点根路径是 https://www.bbc.co.uk/learningenglish,英语教学内容由 english 这一「语言」子站承载(此外还有中文、波斯语、韩语等其他语言子站,链接形式完全相同)。四类入口值得了解:
| 入口 | 地址 | 说明 |
|---|---|---|
| 栏目 A-Z 索引 | /english/index |
站点自己的全栏目清单,本工具据此动态补全栏目列表 |
| 栏目主页 / 滚动归档 | /english/features/{slug} |
近年多为滚动归档,一页可含 500 条期数链接,不支持 ?page= 翻页(参数被忽略) |
| 年份归档 | /english/features/{slug}_{YYYY} |
只对部分年份存在(6 Minute English 实测 2022→2026 可用,_2021/_2019 返回 404),且部分栏目只有年份页,如 Learning English from the News;工具按页面上真实出现的年份链接逐年试探,404 自动跳过 |
| 资源下载站 | https://downloads.bbc.co.uk/learningenglish/... |
音频与 PDF 的实际存放处,根目录直接访问会 403/404,属正常 |
| 官方播客 RSS | https://podcasts.files.bbci.co.uk/{品牌pid}.rss |
BBC 自己公开的无 DRM MP3 列表,页面没有音频直链时从这里兜底取同一期音频 |
几处容易踩坑的细节:
- 期号形式不统一。同一套模板下至少有三类:
ep-260917(6 Minute English、The English We Speak、The Listening Room)、裸日期260917(Learning English from the News、Office English、English in a Minute)、以及语义 slug(Stories 的elephant-ep1、English at Work 的66-language-for-a-wedding-day)。因此工具按「栏目路径下的子链接」泛化识别,而不是死磕某一种正则。 - 同一期页面里的下载入口会重复出现。右侧
div.widget-pagelink-download区块给出Download PDF / Download Audio / Download Transcript,正文<h3>里又内联一遍 worksheet 与 transcript 链接,文字各不相同但指向同一文件。工具按 URL 去重,并按文字与扩展名共同判类,避免把 worksheet 错当成 transcript。 - 资源文件名带栏目缩略 token。6 Minute English 是
{期号}_6_minute_english_{标题}_download.mp3,The English We Speak 是{期号}_tews_{标题}.pdf,Learning English from the News 是{期号}_LEFTN_{标题}_worksheet.pdf,且目录前缀也各不相同(/features/6min、/features/tews、/features/LEFTN、/office_english、/eiam/unit-3…)。内置注册表已为常见栏目记录这些前缀与 token,用于兜底猜地址。 - 文字稿在网页正文里。多数栏目把全文写在
div.widget-richtext .text中,<p>TRANSCRIPT</p>之后是逐句对白,直到下一个<h3>Next</h3>结束。这一段是官方 PDF 之外的可靠文字稿来源。 - 有的栏目根本没有直链。English at Work、10 Easy English words、Ask BBC Learning English、Beating Speaking Anxiety 等只提供 BBC 自己的 EMP/SMP 播放器(页面里是
div.video[data-pid=p0gt7pcv]这样的媒体编号),没有 MP3/MP4/PDF 直链;News Review、English My Way 这类课程页则是unit-N/session-N结构而非单期节目。对这类栏目,工具不会硬编一个假链接,而是明确提示,并在有正文时仍保存transcript.txt/ Print PDF,音频则尝试从官方 Podcast兜底。
一部分栏目(近年的 English in a Minute、British Chat、Easy English Conversations、The Pronunciation Lounge 等)页面上只有 PDF 和在线播放器,没有音频直链。BBC 同时把多数栏目的音频以无 DRM 的公开 MP3发布在自己的官方播客里,期数页面那个「Podcast」下载框指向的就是它。这条路径是 BBC 在站内公开提供的下载入口,不是加密流的旁路,因此本工具把它作为兜底来源:
- 播客源:
https://podcasts.files.bbci.co.uk/{品牌pid}.rss,逐条读取title/pubDate/enclosure,一次运行内按品牌缓存,不重复抓取。 - 品牌来源:优先取页面「Podcast」框里的
/programmes/{pid}/episodes/downloads;其次用内置的栏目 → 播客品牌映射,覆盖 Learning English 的 8 个官方播客(Stories、6 Minute English、Grammar、Vocabulary、Conversations、from the News、For Work、Easy English)。 - 判定规则:标题必须精确同名(忽略大小写与标点,并允许剥掉
Real Easy English:、Episode 50:这类前缀);同名多条时取发布日期与节目日期最接近的一条,且相差不得超过 120 天;既同名多条又没有日期可比对时直接放弃——宁可少下,也不错拿。 - 音质与开关:默认走
audio-nondrm-download(约 128kbps),--podcast-quality low改用约 64kbps;--podcast off完全关闭兜底。 - 来源可查:文件名仍是
{期号}_{标题}.mp3,日志会打印匹配到的播客单集标题与日期,info.json里写入audio_source(品牌 pid、播客标题、发布日期、vpid),便于人工核对。
实测效果:English in a Minute 2025 年的「Phrases with ...」每期都能补齐音频;而同期的新版「4 meanings of ...」系列、10 Easy English words 确实没有任何公开 MP3(音频内嵌在视频里),工具会明确提示,不伪造链接、也不绕过播放器保护。
BBC Learning English 站内的视频(10 Easy English words、The London Letter Challenge、Ask BBC Learning English、Real Easy English 的画面版等)不提供公开直链:页面里只有一个挂 data-pid 媒体编号的受保护播放器,取流要经过 BBC 的媒体鉴权接口。绕过这套保护既违反 BBC 的使用条款,也不适合放进一个开源项目,因此本工具:
- 页面若存在官方
Download Video直链(BBC 一旦开放就自动生效),照常下载到节目目录; - 否则明确提示「视频只存在于 BBC 在线播放器(受保护,无公开直链)」,并把
pid/ 海报 / 在线观看地址写入info.json的player_videos字段; - 音频、PDF、网页文字稿不受影响,照常下载。
如果你确实需要那些视频,请走 BBC 官方页面或官方 App 在线观看。
- Python 3.8+
requests、beautifulsoup4rich(可选,缺失自动降级为纯文本)- Google Chrome / Chromium(仅在需要 Print 生成 A4 PDF 时使用;未找到时自动只保留
transcript.txt,不影响其他下载)
git clone https://github.com/BeepSleepySheep/BBC-LearningEnglish-Downloader.git
cd BBC-LearningEnglish-Downloader
pip install -r requirements.txtpython bbc_learning_english_downloader.py [命令行参数]| 参数 | 说明 |
|---|---|
--check |
仅执行网络连通性检测后退出 |
--list-programs |
列出全部可用栏目(内置注册表 + 站点 A-Z 索引)后退出 |
--program |
指定栏目,逗号分隔,支持全名、slug 或模糊匹配,如 6 Minute English、the-english-we-speak;不指定时交互式勾选 |
--url |
直接下载指定单期页面,可重复或用逗号分隔(跳过栏目/期数选择) |
--year |
只检索指定年份或区间,如 2026、2019-2026、2015,2018,2020-2022;all 或交互时回车 = 全部年份(逐年深挖归档页) |
--out |
下载保存根目录(不指定时交互询问,回车默认 ~/Downloads/BBCLearningEnglish) |
--page-size |
选择界面每页条数(默认 20) |
--limit |
只处理最新的 N 期(试跑调试用,0 表示全部) |
--list-only |
只列出检索结果,不下载 |
--no-input |
非交互模式:直接处理全部检索结果(必须配合 --program,否则要检索全部栏目,太慢) |
--transcript |
文字稿策略:auto(默认,官方 PDF + 网页文字稿,仅在没有任何官方 PDF 时才 Print 兜底)/ pdf(只下官方 PDF)/ print(无视官方 PDF 强制 Print 一份 A4)/ off(不处理文字稿) |
--video |
auto(默认,页面有视频直链就下载,无直链时提示媒体编号与观看地址)/ off(跳过视频) |
--podcast |
auto(默认,页面没有音频直链时自动改用官方 Podcast)/ off(只用页面自身给出的音频链接) |
--podcast-quality |
官方 Podcast 音频码率:high(默认,约 128kbps)/ low(约 64kbps) |
--no-audio |
不下载音频 |
--no-pdf |
不下载任何 PDF(worksheet / transcript) |
--no-txt |
不保存网页内嵌文字稿 transcript.txt |
--no-meta |
不保存 info.json |
--chrome |
指定 Chrome/Chromium 可执行文件路径(Print 用) |
--sleep |
每期之间的间隔秒数(默认 0.4,注意限速) |
--quiet |
精简输出(隐藏下载进度与跳过提示) |
# 交互式完整流程:先勾栏目,再勾年份范围,最后勾期数
python bbc_learning_english_downloader.py
# 看看有哪些栏目可以下
python bbc_learning_english_downloader.py --list-programs
# 只检测网络
python bbc_learning_english_downloader.py --check
# 单个栏目最新 3 期(先试跑,确认无误再批量)
python bbc_learning_english_downloader.py --program "6 Minute English" --limit 3 --out ./try
# 多个栏目 + 指定年份,非交互直接全下
python bbc_learning_english_downloader.py --program the-english-we-speak,learning-english-from-the-news \
--year 2025-2026 --no-input --out ~/Downloads/BBCLearningEnglish
# 只要音频和文字稿,不折腾 PDF/视频
python bbc_learning_english_downloader.py --program "Office English" --video off --no-pdf
# 页面没有音频直链的栏目,看它能否从官方 Podcast 补到音频
python bbc_learning_english_downloader.py --program "English in a Minute" --year 2025 --limit 5 --no-pdf --transcript off
# 某期官方没有 Transcript PDF,强制走 Print 出 A4 文档
python bbc_learning_english_downloader.py --url "https://www.bbc.co.uk/learningenglish/english/features/the-english-we-speak_2026/ep-260914" --transcript print --out ./oneDownloads/BBCLearningEnglish/
├── 6 Minute English/
│ └── 260917_Is_rejection_good_for_us/
│ ├── 260917_6_minute_english_is_rejection_good_for_us_download.mp3
│ ├── 260917_6_minute_english_is_rejection_good_for_us_worksheet.pdf
│ ├── 260917_6_minute_english_is_rejection_good_for_us_transcript.pdf
│ ├── transcript.txt
│ └── info.json
└── The English We Speak/
└── 260914_Hot_take/
├── 260914_tews_hot_take_download.mp3
├── 260914_tews_hot_take.pdf
├── transcript.txt # 从网页正文切出的文字稿
└── transcript_print.pdf # 官方无 Transcript PDF 时 Print 生成
多数栏目的期号就是 YYMMDD 形式的播出日期(如 260917 → 2026-09-17),选择界面直接显示该编号与推算出的日期,避免与列表序号混淆。少数老栏目用语义 slug 作为期号,此时日期栏留空、目录名用标题的规范化结果,不影响下载。
build.bat脚本会装好依赖、用 build_icon.py 把 bbcle_teal.svg 渲染成多尺寸 bbcle_teal.ico,再用 PyInstaller 产出 dist\bbclearningenglish-downloader-windows-x64.exe。
bbcle_teal.svg(主色 #00807D)—— 耳机 + 文稿卡片,与同系列 VOA 图标共用同一套 256×256 栅格与文档几何。
本项目通过 Vibecoding 的方式构建,主观目的是在我学习英语的过程中,方便我获取纯正的英语学习资料。实际使用体验都围绕我的个人学习需求展开,因此在功能取舍上以实用为主。
本工具仅用于索引并下载 BBC Learning English 公开发布的多媒体内容,仅供个人、非商业、学习用途。本项目与 BBC 无任何隶属或背书关系。请尊重 BBC 的版权与使用条款,请勿将下载内容用于商业转发或再分发。