Python 爬取 TED演讲英文资料视频

使用 Python 爬取 TED 演讲视频并合并音视频文件

在这篇博客中,我将详细介绍如何使用 Python 编写一个爬虫,自动从 TED 网站上获取演讲视频的音视频流,并通过 FFmpeg 合并音频和视频文件,最终保存为本地视频文件。本次项目涉及的技术主要包括 requestslxmlre 正则表达式处理、以及通过系统命令调用 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 视频,还可以扩展到其他提供流媒体服务的网站。需要注意的是,在使用爬虫抓取数据时,应尊重目标网站的版权和使用条款。

需要完整源代码的添加

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值