需要下载某网站的视频,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, "下载完成")

python3下载m3u8转mp4_Python3.6:根据m3u8下载mp4视频相关推荐

  1. 【Python网络爬虫实战篇】使用selenium+requests爬取下载高清源视频:关于爬取m3u8文件链接解析为ts视频合并成mp4视频的分析实战

    这两天博主在摸鱼时,偶然间接触到了流媒体的概念,一时间来了兴致.再加上之前博主有着七.八年的视频制作经验,深知视频素材获取的不易.因此,打算利用自己所学的python网络爬虫的知识,通过编写代码实现获 ...

  2. m3u8格式下载合并mp4视频

    m3u8解析.ts视频块解密合并mp4 今天客户有个批量下载视频得需求.拿到链接一顿分析.发现视频是m3u8文件分块.然后有KEY加密.aes-128 下面开始处理流程: 1 先取出key链接.这里得 ...

  3. 使用ffmpeg下载m3u8并转化为MP4视频格式

    因为网页视频下载的需要,需要把m3u8文件转换为MP4文件进行观看,于是发现了好用的ffmpeg. ffmpeg是一个开源的音视频转码工具,它提供了录制.转换以及流化音视频的完整解决方案,可以转码.压 ...

  4. M3U8格式文件比较稳妥的下载方法

    1.如果网速好的话直接用M3U8 Downloader 2.如果网络有限制:(可能是网速,也有可能是网站方面的限制,这个时候可以想想别的方法) 1)用到谷歌插件:猫抓 猫抓的使用: 1)当进入到视频播 ...

  5. linux系统打开m3u8文件,linux:m3u8:如何从.m3u8中列出的段手动下载...

    我有一个.m3u8 url,即http://example.com/test.m3u8 我可以通过ffmpeg命令下载它: ffmpeg -y -loglevel verbose -i "h ...

  6. m3u8 php vob 服务器,使用ffmpeg下载m3u8

    ffmpeg -i 地址 -strict -2 outfile # Fedora 22 and later: $ sudo dnf install https://download1.rpmfusio ...

  7. python视频转化_python实现m3u8格式转换为mp4视频格式

    开发动机:最近用手机QQ浏览器下载了一些视频,视频越来越多,占用了手机内存,于是想把下载的视频传到电脑上保存,可后来发现这些视频都是m3u8格式的,且这个格式的视频都切成了碎片,存在电脑里不方便查看, ...

  8. python mp4 切片_FFmpeg MP4视频切片成TS m3u8播放 好文收集

    第一步: 肯定是要下载FFmpeg啦   这个不想说了 直通车:https://ffmpeg.org/download.html 下载结果 第二部:环境配置 (也可以不配啦  不配的情况下 运行命令的 ...

  9. m3u8解析_浅谈m3u8格式视频文件采集

    在对某在线视频网站抓包分析时,发现该站点采用m3u8格式进行视频文件传输. 通过m3u8的response可以看到,m3u8格式文件由很多段ts文件组成.那么什么是m3u8,什么是ts呢? M3U8是 ...

最新文章

  1. 关于贝叶斯统计的一点总结
  2. 入门指引 - PHP手册笔记
  3. jenkins部署net core初探
  4. UnityVS(Visual Studio Tools For Unity)的安装与使用
  5. 不同位数编译器下的基本数据类型所占的字节数(字节大小):
  6. 燃烧温度计算程序_【知识库】燃气燃烧器如何安全操作?
  7. 路灯智能控制系统_在plc的智能路灯控制系统设计,你必须清楚
  8. 【转】Windows版本,OS内核版本,Windows SDK之间的关系
  9. python字典弱引用_如何使用弱引用优化 Python 程序的内存占用?
  10. tensorflow初试:mnist全连接分类
  11. 计算机中i o接口,计算机组成原理 输入输出(I/O)I/O 接口(I/O 控制器)
  12. Python Map, Filter and Reduce
  13. python高阶函数_python_bomb----高阶函数
  14. 通过AT指令实现ESP8266模块和TCP服务器的数据传输
  15. [洛谷U22157]刷水题(数位dp)(hash)
  16. 小型仓库管理系统——毕业论文
  17. HTML中 常见的浏览器内核有哪些,主流浏览器的内核以及内核前缀是什么?
  18. 软件工程导论 银行储蓄系统_银行储蓄系统.ppt
  19. 公司年终总结新年计划PPT模板
  20. poj1008(Maya Calendar)玛雅历(c++实现)

热门文章

  1. python 打开excel并在屏幕上呈现_如何用Python打开Excel文件显示其内容?
  2. bit、byte、KB、M、G、T相互关系
  3. c语言输出整数n的所有素数因子,输入一个正整数 输出它的所有质数因子的c语言程序...
  4. TensorFlow 从入门到精通(13)—— NLP初探:电影评论感情分析
  5. 数据校验之Checksum算法
  6. iOS疯狂讲解之手势识别器
  7. 一个百万富翁碰到一个陌生人,陌生人找他谈了一个换钱的计划.该计划如下:我每天给你10万,而你第一天给我一分钱,第二天我仍给你十万,你给我二分钱,第三天我仍给你十万,你给我四分钱......你每天给我的
  8. VMware 安装失败解决方案,亲测有效
  9. Postgresql逻辑复制报错could not start WAL streaming: ERROR: replication slot “x“is active for PID xxx
  10. 打包php程序为安装文件,zblogphp主题和插件怎么打包成.zba格式文件