python解决m3u8直播视频的爬取

一、背景

在爬虫方面包括图片,文字,视频,音频等的获取。受到速度的限制,视频的爬取较为麻烦,因为视频是进行切片处理的采取的方式是hls,这是苹果公司制定的一个方案。它会把内容切片,用.m3u8进行组织,在m3u8里面记录了断点的位置,将所有的片段下载下来在拼接就可以连接成整个视频。目前较大的视频都是采取这样的方式。同时m3u8的格式也可以被h5直接读取,这样从理论上和实际过程中解决了视频的传输问题。模型图如下。

二、文件信息

2.1 .m3u8的头文件格式

用检索我们可以在source/media中看到一个.m3u8的文件,通过对这个文件进行访问,可以看到下面的结果。

这一部分包括了文件格式的定义,以及加密方式,和解密的密钥。

# EXTM3U:.m3u8文件的格式定义
# EXT-X-KEY: 密钥的信息
# METHOD: 加密的方法,这里采用的是AES-128的加密方式
# URI: 密钥的地址,需要获取访问得到密钥的信息
# IV: 偏移量,AES加密的方法,通过这个密钥就可以解密,获取正确的视频信息

结果:

2.2 每个.ts的文件片段

每一个.m3u8的片段都包含了这个片段的密钥,加密方法,用于解析视频内容。

# EXINF:片段切割的大小,大概是10s左右
# v.f...:下载的地址,每一个.ts片段都保留一个地址,可能相同可能不同
# EXT-X-KEY:加密的方式和密钥,每一个视频都有一个密钥,可能相同,可能不同
# METHOD:加密方式,AES-128的加密方式

结果

三、解密

3.1 PyCryptodome安装

在有密钥的情况下我们需要进行解密,不然下载的文件就是无法播放的。解密的方法参考加密的手法。这里的密钥是AES,因此使用AES的解密方法去解密。

使用以下的指令安装

# PyCryptodome的安装,由于版本的问题,在使用AES模块的时候,安装PyCryptodome
pip install PyCryptodome 

结果

3.2 构建解码器与解码

首先获取到VI,然后获取到key,构建一个解码器

from Crypto.Cipher import AES
url_key = "key.key"  # 省略写法
content_key = requests.get(url_key).content  # 获取key值
vi = "0x00000000000000000000000000000000"  # vi值一样
vt = vi.replace("0x", "")[:16].encode()  # 偏移码
ci = AES.new(content_key, AES.MODE_CBC, vt)  # 构建解码器
content = requests.get(url_content_ts).content  # 获取加密视频内容
content_ts = ci.decrypt(content)  # 解码ts中的二进制格式

3.3 对获取的content解密

完整的代码

import requests
import os
import re
from Crypto.Cipher import AES

url = "https://1252524126.vod2.myqcloud.com/9764a7a5vodtransgzp1252524126/0176cbbd5285890799673243539/drm/v.f230.m3u8?"
data = {
    "time": ""
}

download_url = "https://1252524126.vod2.myqcloud.com/9764a7a5vodtransgzp1252524126/0176cbbd5285890799673243539/drm/"

"""
列举一个单位格大小:
#EXTINF:2.000000,
v.f230.ts?start=0&end=158495&type=mpegts
#EXT-X-KEY:METHOD=AES-128,URI="https://app.xiaoe-tech.com/get_video_key.php?edk=CiCTzP%2B6jBR9H5awSTdnrwcCQzZlldD%2BTYaAr%2FlaHOwsPBCO08TAChiaoOvUBCokYjRhNjFiNTgtMmVhNy00OWYxLTgwZGMtZTE0NTIyODc5YWIy&fileId=5285890799673243539&keySource=VodBuildInKMS",IV=0x00000000000000000000000000000000
"""

def download():
    url_key = "https://app.xiaoe-tech.com/get_video_key.php?edk=CiCTzP%2B6jBR9H5awSTdnrwcCQzZlldD%2BTYaAr%2FlaHOwsPBCO08TAChiaoOvUBCokYjRhNjFiNTgtMmVhNy00OWYxLTgwZGMtZTE0NTIyODc5YWIy&fileId=5285890799673243539&keySource=VodBuildInKMS"
    content_key = requests.get(url_key).content  # 获取key值
    download_path = os.getcwd() + r"\download"
    if not os.path.exists(download_path):
        os.mkdir(download_path)
    m3u8_content = requests.get(url, params=data).text
    print(m3u8_content)
    exit()
    result = re.compile(r"v\.f230\.ts\?start=[0-9]+&end=[0-9]+&type=mpegts", re.S).findall(m3u8_content)  # 匹配.ts的文件地址
    vi = "0x00000000000000000000000000000000"
    vt = vi.replace("0x", "")[:16].encode()  # 偏移码
    ci = AES.new(content_key, AES.MODE_CBC, vt)  # 构建解码器
    for i in enumerate(result):
        print(f"正在下载:{i[0]}")
        content_ts = requests.get(download_url + str(i[1])).content
        with open(download_path + "\\" + str(i[0] + 1) + ".mp4", ‘ab‘) as f:
            f.write(ci.decrypt(content_ts))  # 将内容解码
            f.flush()

if __name__ == ‘__main__‘:
    download()

四、总结

上述讲述了.m3u8文件的爬取和解析方法,例如直播的爬取,或者是是视频的爬取都涉及到上述的内容。此方法需要自己分析一下内容,没有写成接口的形式,同时这个解码是AES-128的方式,在遇到其他加密方法自行查阅相关解码方式。

五、参考:

下面的blog是一下参考

https://blog.csdn.net/weixin_40346015/article/details/102595690

https://www.jianshu.com/p/98756e274fa0

https://www.52pojie.cn/thread-971265-1-1.html

详细的介绍:https://pakchoi.me/2016/06/21/hls-fe/

包安装问题https://www.cnblogs.com/new-june/p/9401002.html

原文地址:https://www.cnblogs.com/future-dream/p/12582918.html

时间: 2024-10-29 09:20:08

python解决m3u8直播视频的爬取的相关文章

【python爬虫】根据查询词爬取网站返回结果

最近在做语义方面的问题,需要反义词.就在网上找反义词大全之类的,但是大多不全,没有我想要的.然后就找相关的网站,发现了http://fanyici.xpcha.com/5f7x868lizu.html,还行能把"老师"-"学生","医生"-"病人"这样对立关系的反义词查出来. 一开始我想把网站中数据库中存在的所有的词语都爬出来(暗网爬虫),但是分析了url的特点: http://fanyici.xpcha.com/5f7x86

python爬虫实例详细介绍之爬取大众点评的数据

python 爬虫实例详细介绍之爬取大众点评的数据 一. Python作为一种语法简洁.面向对象的解释性语言,其便捷性.容易上手性受到众多程序员的青睐,基于python的包也越来越多,使得python能够帮助我们实现越来越多的功能.本文主要介绍如何利用python进行网站数据的抓取工作.我看到过利用c++和Java进行爬虫的代码,c++的代码很复杂,而且可读性.可理解性较低,不易上手,一般是那些高手用来写着玩加深对c++的理解的,这条路目前对我们不通.Java的可读性还可以,就是代码冗余比较多,

某鱼直播数据全站爬取

前言 本次爬取使用了代理IP,爬取全站为1个小时,当然也可以不用代理proxy,但是要设置爬取速度 time.sleep(5) 先附上完整代码,下面有详解 import csv from fake_useragent import UserAgent import json from lxml import etree import requests # 代理服务器 proxyHost = "http-dyn.abuyun.com" proxyPort = "9020&quo

Python爬虫学习教程,批量爬取下载抖音视频

这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这篇文章主要为大家详细介绍了python批量爬取下载抖音视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 项目源码展示: 1 ''' 2 在学习过程中有什么不懂得可以加我的 3 python学习交流扣扣qun,934109170 4 群里有不错的学习教程.开发工具与电子

大神教你如果学习Python爬虫 如何才能高效地爬取海量数据

Python如何才能高效地爬取海量数据 我们都知道在互联网时代,数据才是最重要的,而且如果把数据用用得好的话,会创造很大的价值空间.但是没有大量的数据,怎么来创建价值呢?如果是自己的业务每天都能产生大量的数据,那么数据量的来源问题就解决啦,但是没有数据怎么办??哈哈哈,靠爬虫来获取呀!!! 通过利用爬虫技术获取规模庞大的互联网数据,然后做市场分析.竞品调研.用户分析.商业决策等. 也许对于小白来说,爬虫是一件非常难且技术门槛高的是,但是如果掌握了正确的方法,在短时间内可以让你应运自如.下面就分享

Python 2.7_利用xpath语法爬取豆瓣图书top250信息_20170129

大年初二,忙完家里一些事,顺带有人交流爬取豆瓣图书top250 1.构造urls列表 urls=['https://book.douban.com/top250?start={}'.format(str(i) for i in range(0, 226, 25))] 2.模块 requests获取网页源代码 lxml 解析网页 xpath提取 3.提取信息 4.可以封装成函数 此处没有封装调用 python代码: #coding:utf-8 import sys reload(sys) sys.

Python实战项目网络爬虫 之 爬取小说吧小说正文

本次实战项目适合,有一定Python语法知识的小白学员.本人也是根据一些网上的资料,自己摸索编写的内容.有不明白的童鞋,欢迎提问. 目的:爬取百度小说吧中的原创小说<猎奇师>部分小说内容 链接:http://tieba.baidu.com/p/4792877734 首先,自己定义一个类,方便使用.其实类就像一个"水果篮",这个"水果篮"里有很多的"水果",也就是我们类里面定义的变量啊,函数啊等等,各种各样的.每一种"水果&q

[python爬虫] BeautifulSoup和Selenium对比爬取豆瓣Top250电影信息

这篇文章主要对比BeautifulSoup和Selenium爬取豆瓣Top250电影信息,两种方法从本质上都是一样的,都是通过分析网页的DOM树结构进行元素定位,再定向爬取具体的电影信息,通过代码的对比,你可以进一步加深Python爬虫的印象.同时,文章给出了我以前关于爬虫的基础知识介绍,方便新手进行学习.        总之,希望文章对你有所帮助,如果存在不错或者错误的地方,还请海涵~ 一. DOM树结构分析 豆瓣Top250电影网址:https://movie.douban.com/top2

python学习笔记之爬虫之爬取百度贴吧某一帖子

从大神这儿静觅 ? Python爬虫实战二之爬取百度贴吧帖子讲的很不错,按照步骤一步一步的做效果很明显.第一次真正做出一个小爬虫程序,所以在csdn写出来也是对自己的一种鞭策一种鼓励,不喜勿喷,还请大神不吝赐教. 因为大神博文讲的很详细(真心详细),所以步骤我就不一一细说了 先把自己的代码贴出来(大部分一样): #!/usr/bin/env python # coding=utf-8 import urllib2 import urllib import re class Tool(object