使用 Python 爬取 TED 演讲视频并合并音视频文件
在这篇博客中,我将详细介绍如何使用 Python 编写一个爬虫,自动从 TED 网站上获取演讲视频的音视频流,并通过 FFmpeg 合并音频和视频文件,最终保存为本地视频文件。本次项目涉及的技术主要包括 requests
、lxml
、re
正则表达式处理、以及通过系统命令调用 FFmpeg 合并音视频文件。
一、项目背景
TED 演讲涵盖了许多领域的内容,通常包含高质量的视频和音频资源。通过编写一个爬虫程序,我们可以自动化地获取这些资源并将其保存到本地,方便离线查看。
二、环境准备
在开始之前,确保你已经安装了以下库和工具:
- Python 3.x
requests
库:用于发送 HTTP 请求。lxml
库:用于解析 HTML 文档。- FFmpeg:用于处理音视频文件的开源工具。
可以通过以下命令安装 Python 库:
pip install requests lxml
FFmpeg 可以通过其官网下载安装,也可以使用包管理器安装,例如:
# 在 Windows 上,下载 ffmpeg.exe 并将其路径添加到系统 PATH 中
# 在 Linux 上,使用以下命令安装
sudo apt-get install ffmpeg
三、代码实现
这个项目分为以下几个部分:从 TED 网站获取视频 URL,下载音频和视频流,合并 .ts
文件片段,最后通过 FFmpeg 合并音视频文件。
1. 获取视频 URL
首先,我们从 TED 网站的主页上获取演讲视频的 URL 及其标题。
import re
import requests
def get_vid_url():
url = 'https://www.ted.com/talks'
req = requests.get(url)
# 使用正则表达式提取演讲标题
pattern =
title_list = re.findall(pattern, req.text)
# 使用正则表达式提取视频 URL
pattern =
url_list = re.findall(pattern, req.text)
for url, title in zip(url_list, title_list):
print(title)
print(url)
get_id = get_vid(url)
video_url = f".m3u8"
audio_url = f"8"
merge_ts(type='video')
try:
merge_ts(type='audio')
except:
merge_ts(type='audio')
merge_video_audio('video/video.mp4', 'audio/audio.mp3', f'finished/{title}.mp4')
print(f'文件已保存-->finished/{title}.mp4')
这里,我们首先获取了 TED 演讲页面的 HTML 内容,并使用正则表达式提取出演讲的标题和视频的 URL。
2. 获取视频 ID
在获取到视频的 URL 后,我们需要进一步提取出视频的 ID,用于构建音视频流的下载链接。
def get_vid(url):
res = requests.get(url)
match =
if match:
extracted_number = match.group(1)
print(extracted_number)
else:
extracted_number = 0
return int(extracted_number)
这个函数使用正则表达式从 HTML 中提取出视频的唯一 ID,这个 ID 在后续的 M3U8 文件下载中将会用到。
3. 下载并保存 M3U8 文件和 .ts
文件片段
M3U8 文件包含了音视频流的各个片段(.ts
文件)的 URL,通过解析这些 URL,我们可以下载音视频片段。
def get_file(url, type):
response = requests.get(url)
content = response.text
mv_url = line.strip()
file_name = mv_url.split("/")[-1]
response = requests.get(mv_url)
if response.status_code == 200:
with open(f"{type}/{file_name}", "wb") as file:
file.write(response.content)
print(f"Downloaded {file_name}")
else:
print(f"Failed to download {file_name}")
在这个部分,我们下载了 M3U8 文件,并逐行解析其中的 .ts
文件片段的 URL,然后将这些片段保存到本地。
4. 合并 .ts
文件
下载完所有 .ts
文件片段后,我们需要将它们合并为一个完整的音频或视频文件。
import os
def merge_ts(type):
name_list = []
with open(f"{type}.m3u8", mode="r", encoding='utf-8') as f:
for line in f:
if line.startswith("#"):
continue
line = line.strip()
file_name = line.split("/")[-1]
name_list.append(file_name)
now_dir = os.getcwd()
os.chdir(f"{type}/")
temp = []
n = 1
for i in range(len(name_list)):
name = name_list[i]
temp.append(name)
if i != 0 and i % 100 == 0:
names = "+".join(temp)
os.system(f"copy /b {names} {n}.ts")
n += 1
temp = []
names = "+".join(temp)
os.system(f"copy /b {names} {n}.ts")
n += 1
temp_2 = []
for i in range(1, n):
temp_2.append(f"{i}.ts")
names = "+".join(temp_2)
if type == 'audio':
os.system(f"copy /b {names} audio.mp3")
else:
os.system(f"copy /b {names} video.mp4")
os.chdir(now_dir)
这个函数将多个 .ts
文件按顺序合并为一个 .mp4
或 .mp3
文件,最终生成的音视频文件会在后面合并成完整的视频。
5. 合并音频和视频文件
最后一步,通过 FFmpeg 将合并好的音频文件和视频文件合并成一个完整的视频文件。
import subprocess
def merge_video_audio(video_file, audio_file, output_file):
command = ['ffmpeg', '-i', video_file, '-i', audio_file, '-c:v', 'copy', '-c:a', 'copy', output_file]
subprocess.run(command)
通过调用 FFmpeg 命令行工具,我们将视频和音频合并成一个文件,并保存到指定位置。
6. 主程序入口
if __name__ == '__main__':
get_vid_url()
主程序调用 get_vid_url
函数,自动执行视频 URL 的获取、M3U8 文件的下载、.ts
文件的合并,以及最终的音视频合成。
** 爬取结果展示**
四、总结
通过这篇博客,我们完成了一个完整的 Python 爬虫项目,能够自动化地从 TED 网站上抓取视频和音频流,并通过 FFmpeg 将其合成为本地视频文件。在实际应用中,这种技术不仅可以应用于 TED 视频,还可以扩展到其他提供流媒体服务的网站。需要注意的是,在使用爬虫抓取数据时,应尊重目标网站的版权和使用条款。