python 爬虫 m3u8 视频文件 加密解密 整合mp4

这篇具有很好参考价值的文章主要介绍了python 爬虫 m3u8 视频文件 加密解密 整合mp4。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、完整代码

完整代码如下:

import requests
from multiprocessing import Pool
import re
import os
from tqdm import tqdm
from Crypto.Cipher import AES


# 创建临时文件夹
dirs = 'ts_list_need_to_merge/'
os.makedirs(dirs, exist_ok=True)

headers = {
        'Accept': '*/*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Connection': 'keep-alive',
        'Origin': 'http://www.kpd510.me',
        'Referer': 'http://www.kpd510.me/',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'cross-site',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69',
        'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
    }



def parse_m3u8_text(m3u8_text):
    m3u8_text = m3u8_text.split()
    encode_info = [line for line in m3u8_text if line.startswith('#EXT-X-KEY:')][0]
    pattern = r"#EXT-X-KEY:METHOD=(.*),URI=\"(.*)\""  
    
    ## 获得加密method 和 key.key的url
    match = re.search(pattern, encode_info)
    if match:
        method = match.group(1)
        key_url = match.group(2)
    else:
        raise '解析失败'
    
    ## 获得ts文件url
    ts_list = [line for line in m3u8_text if line.endswith('ts')]
    return method, key_url, ts_list

def decrypt_content_and_save_file(filename, content, decrypter):
    with open(filename, mode='wb') as f:
        f.write(decrypter.decrypt(content))


def merge_ts_to_mp4(filename, ts_file_list):
    with open(filename, mode='ab') as f1:
        for ts_file in ts_file_list:
            with open(ts_file, mode='rb') as f2:
                f1.write(f2.read())
    print(filename, '完成!')


def process_one_url(ts_url, key):
    decrypter = AES.new(key, AES.MODE_CBC)
    filename = dirs + os.path.split(ts_url)[-1]
    content = requests.get(ts_url, headers=headers).content
    decrypt_content_and_save_file(filename, content, decrypter)
    return filename


def download_method_1(ts_list, key):
    # 普通次序一个一个下载,耗时11分钟
    ts_file_list = []
    for ts_url in tqdm(ts_list):
        filename = process_one_url(ts_url=ts_url, key=key)
        ts_file_list.append(filename)
    return ts_file_list


def download_method_2(ts_list, key, processes_nums=2):
	# 多进程下载, 耗时1分钟
    class CallBack:
        def __init__(self, nums) -> None:
            self.pbar = tqdm(total=nums)
            self.filenames = []
        
        def callback(self, filename):
            self.pbar.update(1)
            self.filenames.append(filename)
    
    callback = CallBack(len(ts_list))
    pool = Pool(processes=processes_nums)
    for ts_url in ts_list:
        pool.apply_async(process_one_url, (ts_url, key), error_callback=print, callback=callback.callback)
    pool.close()
    pool.join()
    callback.pbar.close()
    return [dirs + os.path.split(ts_url)[-1] for ts_url in ts_list]


if __name__ == "__main__":
    m3u8_url = 'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/index.m3u8'
    response = requests.get(m3u8_url, headers=headers)
    m3u8 = response.text
    method, key_url, ts_list = parse_m3u8_text(m3u8)
    
    key_url = 'https://play.bo262626.com' + key_url
    ts_list = ['https://play.bo262626.com' + item for item in ts_list]
    
    key = requests.get(key_url, headers=headers).content
    ts_file_list = download_method_2(ts_list, key=key, processes_nums=10)
    
    merge_ts_to_mp4('test.mp4', ts_file_list)

二、视频分析

1. 认识m3u8文件

m3u8的结构详细分析可以看这个链接m3u8 文件格式详解 - 简书 (jianshu.com),这里我们只简要介绍一下;

相信无论多小白都应该知道如何打开开发者模型解析得到下面的结果;

本地视频利用python写个mp4加密及解密,数据采集 Python爬虫,python,爬虫

要注意的是,只有预览里面包含了ts信息的才算是我们需要的m3u8文件;大家可以看到左侧有两个index.m3u8,其中一个是没有ts信息的,所以我们直接忽略掉;现在我们先下载来,再来具体分析一下m3u8文件以及里面的内容分别表达什么意思;

下载代码如下:

import requests
import re

headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Connection': 'keep-alive',
    'Origin': 'http://www.kpd510.me',
    'Referer': 'http://www.kpd510.me/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'cross-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69',
    'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

response = requests.get('https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/index.m3u8', headers=headers)

m3u8 = response.text

m3u8文件的实质是一个视频的url列表,其中ts是计算器可以直接播放的视频格式文件,但是直接下载是可能被加了密的文件,我们需要m3u8文件内容信息进行解密;

我们可以这样理解,m3u8把一个完整的mp4视频切割成了很多的小块,每一个小块在m3u8都是ts文件格式,并在m3u8中采取了加密的措施,至于为什么要加密,这里就不多介绍;

在一般的视频爬取中,我们只需要考虑两个部分,一个是EXT-X-KEY,一个是ts

本地视频利用python写个mp4加密及解密,数据采集 Python爬虫,python,爬虫

其中EXT-X-KEY包含了ts的加密方式,ts包含了ts文件的下载地址;

在红色部分也就是EXT-X-KEY部分,我们可以从METHOD中获取到采取的加密方式是AES-128,同时看到URI的地址/20231126/10VkaJks/700kb/hls/key.key,这也就是AES加密密匙的地址:key.key,接下来我们写一个文件来对m3u8文件解析,目的是提取出红色部分和蓝色部分;

代码如下:

def parse_m3u8_text(m3u8_text):
    m3u8_text = m3u8_text.split()
    encode_info = [line for line in m3u8_text if line.startswith('#EXT-X-KEY:')][0]
    pattern = r"#EXT-X-KEY:METHOD=(.*),URI=\"(.*)\""  
    
    ## 获得加密method 和 key.key的url
    match = re.search(pattern, encode_info)
    if match:
        method = match.group(1)
        key_url = match.group(2)
    else:
        raise '解析失败'
    
    ## 获得ts文件url
    ts_list = [line for line in m3u8_text if line.endswith('ts')]
    return method, key_url, ts_list

## 在这里我们直接把m3u8文本丢进去就可以获得
## method, key_url, ts_list
method, key_url, ts_list = parse_m3u8_text(m3u8)
## method = 'AES-128'
## key_url = '/20231108/xV1bY9Cn/700kb/hls/key.key'
## ts_list = ['...ts', '...ts', ...]

2. 获取密钥,构建解密器

因为构建解密器我们需要密钥,而密钥存储在key.key中,首先我们需要解析key_url获取密钥;

在这里可以明显的看到key_url = '/20231108/xV1bY9Cn/700kb/hls/key.key'这不是一个完整的url,我们在这里加上获取m3u8请求的主域名便好;

代码如下:

headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Connection': 'keep-alive',
    'Origin': 'http://www.kpd510.me',
    'Referer': 'http://www.kpd510.me/',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'cross-site',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69',
    'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Windows"',
}

key_url = 'https://play.bo262626.com' + key_url
key = requests.get(key_url, headers=headers).content
# 这里我们得到key = b'388d590fabfeabcf' 是一个二进制结果

得到了密钥,再结合加密方式AES-128,我们就可以构建一个解密器,构建解密器代码如下:

from Crypto.Cipher import AES
## 这里网络爬取视频一般是MODE_CBC模式
decrypter = AES.new(key, AES.MODE_CBC)

这里要提起的是网络上的m3u8文件采取的加密一般是AES.MODE_CBC模式,在后续操作中如果这里出问题就换MODE一个一个试就好;

3. 下载ts文件

由于有许多的ts文件,我们有三种方法,第一是简单的requests请求一个一个下,这也是最费时的一种;第二个是多进程或者多线程的方式下载;第三个是采用协程的方式;接下来我们一个个实现;

在开始之间,ts_list存在同样的问题,就是需要重构url,这里代码如下:

ts_list = ['https://play.bo262626.com' + item for item in ts_list]

# 这里得到:
# ['https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/o3jSJ9mc.ts',
#  'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/GNHDlClJ.ts',
#  'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/zKym5c6V.ts',
#  'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/4ll4NQH3.ts',
#  'https://play.bo262626.com/20231108/xV1bY9Cn/700kb/hls/RwUOniSQ.ts' ...]

再测试一下解密器是否可以:

import os
from tqdm import tqdm

dirs = 'ts_list_need_to_merge/'
os.makedirs(dirs, exist_ok=True)


def decrypt_content_and_save_file(filename, content, decrypter):
    with open(filename, mode='wb') as f:
        f.write(decrypter.decrypt(content))


def process_one_url(ts_url, key):
    decrypter = AES.new(key, AES.MODE_CBC)
    filename = dirs + os.path.split(ts_url)[-1]
    content = requests.get(ts_url, headers=headers).content
    decrypt_content_and_save_file(filename, content, decrypter)
    return filename

process_one_url(ts_list[0], key)

## 打开视频看是否能打开
## 如果能打开说明解密没问题

直接requests: 代码如下

def download_method_1(ts_list, key):
    # 这里弄一个filename_list 方便后续合并ts到mp4
    ts_file_list = []
    for ts_url in tqdm(ts_list):
        filename = process_one_url(ts_url=ts_url, key=key)
        ts_file_list.append(filename)
    return ts_file_list

# 下载测试
ts_file_list = download_method_1(ts_list, key)

实现挺慢的,不合理;

本地视频利用python写个mp4加密及解密,数据采集 Python爬虫,python,爬虫

多进程: 代码如下

def download_method_2(ts_list, key, processes_nums=2):
    class CallBack:
        def __init__(self, nums) -> None:
            self.pbar = tqdm(total=nums)
            self.filenames = []
        def callback(self, filename):
            self.pbar.update(1)
            self.filenames.append(filename)

    callback = CallBack(len(ts_list))
    pool = Pool(processes=processes_nums)
    for ts_url in ts_list:
        pool.apply_async(process_one_url, (ts_url, key), error_callback=print, callback=callback.callback)
    pool.close()
    pool.join()
    callback.pbar.close()
    return [dirs + os.path.split(ts_url)[-1] for ts_url in ts_list]

ts_file_list = download_method_2(ts_list, key=key, processes_nums=10)

爬取巨快,1分钟下载20多分钟的视频;

本地视频利用python写个mp4加密及解密,数据采集 Python爬虫,python,爬虫

4. 合并ts文件为mp4

在完成前面的步骤后,直接ab的方式把所有的文件按顺序加入就好;

def merge_ts_to_mp4(filename, ts_file_list):
    with open(filename, mode='ab') as f1:
        for ts_file in ts_file_list:
            with open(ts_file, mode='rb') as f2:
                f1.write(f2.read())

merge_ts_to_mp4('test.mp4', ts_file_list)

后续如果需要删除'ts_list_need_to_merge/'这个临时文件夹里面的所有内容,直接运行下面代码

import send2trash

send2trash.send2trash('ts_list_need_to_merge/') # send2trash.send2trash(dirs)

三、总结

别在图书馆测试这段代码!文章来源地址https://www.toymoban.com/news/detail-829331.html

到了这里,关于python 爬虫 m3u8 视频文件 加密解密 整合mp4的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ffmpeg 下载网上m3u8的视频文件

    FFmpeg 是一个音视频领域使用最广泛的跨平台开源库。由C语言编写,但广泛的为 C/C++、C#、Java、Python 等主流编程语言所调用。它集合了几乎所有的编码解码库与流协议,几乎能完美处理音视频开发领域的所有需求。 方式一:源码安装 FFmpeg 通过编译源码安装 FFmpeg 的优点是可

    2023年04月09日
    浏览(30)
  • 【M3U8】python(流视频数据)

    现在大部分视频客户端都采用HTTP Live Streaming,而不是直接播放MP4等视频文件(HLS,Apple为了提高流播效率开发的技术)。HLS技术的特点是将流媒体切分为若干【TS片段】(比如几秒一段),然后通过一个【M3U8列表文件】将这些TS片段批量下载供客户端播放器实现实时流式播放

    2023年04月09日
    浏览(22)
  • 处理前端访问m3u8视频文件出现跨越问题

    一、后端模板渲染的方式,不需要处理,不会存在跨域问题 二、如果是前后端分离项目在 nginx 中配置跨域 1、 m3u8 文件存放在服务器地址为`/home/video-api/public/uploads/video 2、修改 nginx 的配置 3、客户端在 js 代码里面输入视频地址 http://【ip或者域名】/uploads/video/1686034066126185.m3u

    2024年02月09日
    浏览(39)
  • Python爬取m3u8格式的视频

    声明:本文只作学习研究,禁止用于非法用途,否则后果自负,如有侵权,请告知删除,谢谢! 在某一天,群友分享了一些小视频,手机端可以正常观看,但是到了电脑上,输入网址之后会下载下来一个m3u8格式的文件,这就让我犯了难。所以我就研究了一下,并使用Python来

    2023年04月13日
    浏览(47)
  • Python 实现 m3u8 视频下载

    m3u8 是一种 基于文本的媒体播放列表文件格式 ,通常用于指定流媒体播放器播放在线媒体流。它是一个简单的文本文件,其中包含多个由 URI 引用的媒体资源文件的 URL。m3u8 文件通常包含多个 ts 文件的链接,这些 ts 文件是实际的视频和音频数据文件,通常是通过 HTTP 协议传

    2024年02月07日
    浏览(39)
  • python 批量下载m3u8的视频

     前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:点击跳转 目录 一,猫抓获取视频地址 二,安装配置ffmpeg 1,windows使用 2,python使用 三,碧站视频 四,合并ts文件 1,背景 2,实现 4,缺点 五,下载m3u8视频 1,背景 2,实现V1 3,实

    2024年02月13日
    浏览(33)
  • 【python】多线程下载m3u8分段视频

    1.说明 m3u8是一种传输数据的方式,比如说一集20分钟的完整视频被分割成一千多段一两秒的小视频,客户端播放的时候是感觉是连续,但如果你要下载这集视频,那就要把一千多个小视频全都下载然后自己拼接成一个完整视频。拼接的话很简单,像格式工厂等很多软件都可以

    2024年02月12日
    浏览(27)
  • 视频网站的工作原理-->m3u8视频文件的提取与解析(理论)

    目录 一、视频网站的工作原理 二、抓取视频步骤 2.1、找到m3u8文件 2.2、把m3u8下载到ts文件 2.3、ts文件合并为mp4文件         古老的视频网站的视频一般是在源码放一个video src=\\\"xxx.mp4\\\"/video,用户点击播放视频,会跳转到src的连接进行视频资源的获取进行播放。 缺点:视频

    2024年02月13日
    浏览(22)
  • 抓取m3u8视频

    视频url:https://www.9meiju.cc/mohuankehuan/shandianxiadibaji/1-1.html 打开网址分析当前视频是由多个片段组成还是单独一个视频 如果是一个单独视频,则找到网址,直接下载即可,如果为多个片段的视频,则需要找到片段的文件进行处理,本案例以m3u8为例 找到m3u8文件后进行下载,下载

    2024年02月11日
    浏览(34)
  • CRMEB知识付费二次开发 加密阿里云视频MP4点播链接为m3u8格式 hls blob协议

    只有添加分发加速的域名才能使用HLS加密,同时也要做HTTPS证书添加,不然也会报错。 1、这是电脑端视频播放页面效果 2、这个手机端H5视频播放页面效果 3、在网站后台上传你的视频内容 4、上传完之后可以进行预览 5、在阿里云控制台设置就好自己的转码模板 将不转码设为

    2024年02月08日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包