python3.6根据m3u8下载mp4视频

需要下载某网站的视频,chrome浏览器按F12打开开发者模式,发现视频链接是以"blob:http"开头的链接,打开这个链接后找不到网页,网上查了下,找到了下载方法,在这里做个记录,如果有错误,欢迎指出。

程序在Windows 10下运行,不过Linux应该也没问题。

使用到的有re模块,requests模块和Crypto模块,其中requests模块和Crypto模块如果没安装可以使用pip命令安装。(Crypto模块安装感觉比较坑,我是从anaconda里拷贝了一份)

下面开始正题:

注:以下使用的m3u8文件所在的网站是自己搭建用来测试的,链接可能会失效。

首先在chrome的network里找到一个m3u8文件的请求,可以通过它下载视频。

通过Preview可以看到m3u8文件的内容。

这里m3u8文件比较重要的内容有两个。

一个是URI后面的链接,这个是加密和解密的秘钥,如果m3u8文件里有这个URI,那么这个视频就是经过了加密的,加密的方法可以看URI前面,这里是AES-128加密算法。

另一个是以ts结尾链接,这个是视频片段,如果是没进行加密的,可以直接打开这个链接下载视频片段,下载下来的是后缀为ts的文件,一般可以直接播放,不过时间很短。如果是加密过的,下载后播放会提示视频文件已损坏。

知道这些后,就可以进行下载了,先获取m3u8文件的内容,然后解析出秘钥(key)和ts的链接,然后下载key对每一个ts进行解密,保存到一个mp4文件里。

下载用的是requests模块,解析key和ts的链接是用的re模块,解密用的是Crypto模块。

使用Crypto需要注意三个地方,一个是安装和导入,第二个是Crypto里AES.new的参数,第三个是decrypt方法的参数。下面先看代码。

导入模块:

import re
import requests
from Crypto.Cipher import AES

初始设置:

# 保存的mp4文件名
name = "dream_it_possible.mp4"

# m3u8文件的url
url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8"

# 请求头,不一定需要,看网站更改
headers = {
 "Referer": "http://www.jiuyi.info/video/dream_it_possible",
 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
     "(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36",
 }

获取m3u8文件内容,并解析出key和ts文件的url。

# 获取m3u8文件内容
r = requests.get(url)

# 通过正值表达式获取key和ts的url
k = re.compile(r"http://.*?\.key") # key的正则匹配
t = re.compile(r"http://.*?\.ts")  # ts的正则匹配
key_url = k.findall(r.text)[0]  # key的url
ts_urls = t.findall(r.text)  # ts的url列表

下载并解密ts文件,保存为mp4文件。

# 下载key
key = requests.get(key_url).content

# 解密并保存ts
for ts_url in ts_urls:

 ts_name = ts_url.split("/")[-1]  # ts文件名

 # 解密,new有三个参数,
 # 第一个是秘钥(key)的二进制数据,
 # 第二个使用下面这个就好
 # 第三个IV在m3u8文件里URI后面会给出,如果没有,可以尝试把秘钥(key)赋值给IV
 sprytor = AES.new(key, AES.MODE_CBC, IV=key)

 # 获取ts文件二进制数据
 ts = requests.get(ts_url).content

 # 密文长度不为16的倍数,则添加二进制"0"直到长度为16的倍数
 while len(ts) % 16 != 0:
 ts += b"0"

 # 写入mp4文件
 with open(name, "ab") as file:
  # decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0"
  file.write(sprytor.decrypt(ts))
 print(name, "下载完成")

到这里就下载完成了。

完整代码:

import re
import requests
from Crypto.Cipher import AES

# 保存的mp4文件名
name = "dream_it_possible.mp4"

# m3u8文件的url
url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8"

# 请求头,不一定需要,看网站更改
headers = {
 "Referer": "http://www.jiuyi.info/video/dream_it_possible",
 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
     "(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36",
 }

print("正在解析:" + url.split("/")[-1])

# 获取m3u8文件内容
r = requests.get(url)

# 通过正值表达式获取key和ts的链接
k = re.compile(r"http://.*?\.key") # key的正则匹配
t = re.compile(r"http://.*?\.ts") # ts的正则匹配
key_url = k.findall(r.text)[0] # key的url
ts_urls = t.findall(r.text) # ts的url列表

# 下载key的二进制数据
print("正在下载key")
key = requests.get(key_url).content

# 解密并保存ts
for ts_url in ts_urls:

 ts_name = ts_url.split("/")[-1]  # ts文件名

 # 解密,new有三个参数,
 # 第一个是秘钥(key)的二进制数据,
 # 第二个使用下面这个就好
 # 第三个IV在m3u8文件里URI后面会给出,如果没有,可以尝试把秘钥(key)赋值给IV
 sprytor = AES.new(key, AES.MODE_CBC, IV=key)

 # 获取ts文件二进制数据
 print("正在下载:" + ts_name)
 ts = requests.get(ts_url).content

 # 密文长度不为16的倍数,则添加b"0"直到长度为16的倍数
 while len(ts) % 16 != 0:
  ts += b"0"

 print("正在解密:" + ts_name)

 # 写入mp4文件
 with open(name, "ab") as file:
  # # decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0"
  file.write(sprytor.decrypt(ts))
  print("保存成功:" + ts_name)
print(name, "下载完成")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python opencv读mp4视频的实例

    如下所示: #获得视频的格式 videoCapture = cv2.VideoCapture('/home/lw/3661.mp4') #获得码率及尺寸 fps = videoCapture.get(cv2.CAP_PROP_FPS) size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)), int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))) fNUMS = videoCapture.get(

  • Python代码打开本地.mp4格式文件的方法

    想通过编写Python代码来打开本地的.mp4格式文件,使用os模块来操作文件.我的电脑默认的是QQ影音播放器,执行Python代码打开默认播放器,播放代码中指定的视频文件. class Video(object): def __init__(self,path): self.path = path def play(self): from os import startfile startfile(self.path) class Movie_MP4(Video): type = 'MP4'

  • python 实现视频流下载保存MP4的方法

    如下所示: # -*- coding:utf-8 -*- import sys import os from glob import glob import requests reload(sys) sys.setdefaultencoding("utf-8") file_path=os.getcwd() #获取需要转换的路径 def get_user_path(argv_dir): if os.path.isdir(argv_dir): return argv_dir elif os

  • python实现m3u8格式转换为mp4视频格式

    开发动机:最近用手机QQ浏览器下载了一些视频,视频越来越多,占用了手机内存,于是想把下载的视频传到电脑上保存,可后来发现这些视频都是m3u8格式的,且这个格式的视频都切成了碎片,存在电脑里不方便查看,于是想把它转换为其他可以直接打开播放的完整视频,到网上找了一些工具,都不怎么好用,后来发现一个手机端的"缓冲合并工具",倒是可以用,但是合并的视频顺序是乱的,碎片的视频顺序还需要用户手动调整,感觉太耽误时间了,于是自己打算写一个转换工具. 直接上代码:(程序的文件名为:convert_m3

  • python3.6根据m3u8下载mp4视频

    需要下载某网站的视频,chrome浏览器按F12打开开发者模式,发现视频链接是以"blob:http"开头的链接,打开这个链接后找不到网页,网上查了下,找到了下载方法,在这里做个记录,如果有错误,欢迎指出. 程序在Windows 10下运行,不过Linux应该也没问题. 使用到的有re模块,requests模块和Crypto模块,其中requests模块和Crypto模块如果没安装可以使用pip命令安装.(Crypto模块安装感觉比较坑,我是从anaconda里拷贝了一份) 下面开始正

  • Python解析m3u8拼接下载mp4视频文件的示例代码

    一.关于m3u8: m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过编码方式是utf-8,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求. 示例: #EXTM3U #EXT-X-TARGETDURATION:10 #EXTINF:9, http://data.video.iqiyi.com/videos/vts/20210301/69/b8/73ad4ef0

  • ffmpeg网页视频流m3u8 ts实现视频下载

    目录 引言 下载视频所有的ts切片文件 引言 现在很多视频网站播放流视频,都不是采用mp4/flv文件直接播放,而是采用m3u8/ts这种方式播放. 简单说就是,网站后台把视频切片成成百上千个xx.ts文件,一般10秒一个,每个都几百kb很小.然后通过xx.m3u8播放列表把这些文件连接起来. 通过Chrome DevTool的Network栏,我们可以清楚的看到加载过程: 我们直接点击这个playlist.m3u8播放列表文件,在旁边的preview栏中查看内容,可以看到: #EXTM3U #

  • Python视频爬虫实现下载头条视频功能示例

    本文实例讲述了Python视频爬虫实现下载头条视频功能.分享给大家供大家参考,具体如下: 一.需求分析 抓取头条短视频 思路: 分析网页源码,查找解析出视频资源url(查看源代码,搜mp4) 对该url发起请求,返回二进制数据 将二进制数据保存为视频格式 视频链接: http://video.eastday.com/a/170612170956054127565.html 二.代码实现 # encoding: utf-8 import sys reload(sys) sys.setdefault

  • python爬取m3u8连接的视频

    本文为大家分享了python爬取m3u8连接的视频方法,供大家参考,具体内容如下 要求:输入m3u8所在url,且ts视频与其在同一路径下 #!/usr/bin/env/python #_*_coding:utf-8_*_ #Data:17-10-08 #Auther:苏莫 #Link:http://blog.csdn.net/lingluofengzang #PythonVersion:python2.7 #filename:download_movie.py import os import

  • python中使用you-get库批量在线下载bilibili视频的教程

    此文章描述的是在windows10系统pc端python环境下,利用you-get库来进行bilibili视频批量下载,是在cmd中操作完成,只建议有python环境的用户使用. 1.安装you-get库,此处需要注意的是you-get的安装不可以用conda命令行安装,刚刚一股脑只想着annoconda的conda命令,浪费了很多时间. pip install you-get 2.安装完成以后,就可以进行视频下载啦! you-get -o 本地存储路径 bilibili视频在线网址 以上是单个

  • 利用python 下载bilibili视频

    运行效果: 完整代码 # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/21--20:12 __author__ = 'Henry' ''' 项目: B站动漫番剧(bangumi)下载 版本2: 无加密API版,但是需要加入登录后cookie中的SESSDATA字段,才可下载720p及以上视频 API: 1.获取cid的api为 https://api.bilibili.com/x/web-interface/view?aid=4

  • python 批量下载bilibili视频的gui程序

    运行效果: 完整代码: # !/usr/bin/python # -*- coding:utf-8 -*- # time: 2019/07/02--08:12 __author__ = 'Henry' ''' 项目: B站视频下载 - GUI版本 版本1: 加密API版,不需要加入cookie,直接即可下载1080p视频 20190422 - 增加多P视频单独下载其中一集的功能 20190702 - 增加视频多线程下载 速度大幅提升 20190711 - 增加GUI版本,可视化界面,操作更加友好

  • 通过Python将MP4视频转换为GIF动画

    目录 运行环境 如何从 MP4 视频中提取帧 将帧变成 GIF 创建 MP4 到 GIF GUI Python 可用于读取常见的 MP4 视频格式并将其转换为 GIF动画.当然,如果你愿意,你可以使用预先构建的软件,但是自己做很有趣(并且是一种很好的学习体验). 在本教程中,你将学习以下内容: 如何从 MP4 视频中提取帧 将帧转换为 GIF 创建 MP4 到 GIF GUI 让我们开始吧! 运行环境 你需要安装 OpenCV 绑定以读取 MP4 文件并将视频中的每一帧转换为 JPG 文件.安装

随机推荐