需要下载某网站的视频,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)赋值给IVsprytor = 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)赋值给IVsprytor = 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.6:根据m3u8下载mp4视频相关推荐

  1. python3下载m3u8转mp4_Python3.6:根据m3u8下载mp4视频

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

  2. m3u8转MP4 视频最最有效的办法!!!!!!!

    m3u8转MP4 视频最最有效的办法!!!!!!! 手写日志. 解决办法就是这个! m3u8转MP4 视频最最有效的办法!!!!!!! http://www.oicqzone.com/soft/201 ...

  3. Ueditor 富文本编辑器 插入 m3u8 和 mp4 视频(PHP)

    当前环境:PHP.Ueditor的版本是1.4.3 新的需求是,需要在Ueditor 富文本编辑器中,插入视频播放,并且视频格式有MP4,也有M3U8. 百度编辑器默认的是embed,需要修改下配置. ...

  4. Python解析m3u8拼接下载mp4视频文件

    一.关于m3u8: m3u8是苹果公司推出一种视频播放标准,是m3u的一种,不过编码方式是utf-8,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I ...

  5. okdownload下载mp4视频文件

    因为使用aria下载后有些视频不能正常播放.找了很多原因也没找出来.后来可能想是视频加密解密的问题.改了加解密逻辑之后问题还是存在,aria的源码也不想分析,想着可能是断点下载的时候丢了几个字节.就想 ...

  6. ffmpeg简易使用应用分享(m3u8下载与视频合并等)

    一.先分享下嗅探资源 第一个是视频下载器 CoCoCut 第二个猫抓都知道 谷歌扩展下载===扩展迷地址 二.M3U8 Downloader 这个直接找到一个.m3u8结尾的写入就可以开始下载了, 其 ...

  7. python 爬取m3u8 to MP4 视频

    twtter 一.用postman 捋顺爬取流程 1.进行身份验证 第一次握手连接 第二次提交cookie信息,获得token信息 2.获取视频连接json数据 https://api.twitter ...

  8. 使用you-get工具下载MP4视频

    you-get是一个下载视频流工具,可以下载b站等视频. pip安装you-get工具 pip install you-get 下载一个b站视频 第一步:查看视频信息 you-get -i " ...

  9. Python下载MP4视频

    import os import time import requests from tqdm import tqdm # 进度条模块def down_from_url(url, dst):# 设置s ...

  10. python如何下载MP4视频和获取时长

    我们做爬虫工作时,经常会遇到要把爬取的视频下载到本地做存储,那么我们如何使用python去下载视频呢,下载视频不是本文章的重点,在此废话不多说,直接上完整的代码: def download_file( ...

最新文章

  1. mysql外键写了会怎么样_mysql使用外键会影响性能吗
  2. 分享mac磁盘清理的方法
  3. Nova Conductor 与 Versioned Object Model 机制
  4. NDK 与 JNI 的关系
  5. 全球首个无人驾驶政策颁布,各大巨头并不完全买账
  6. 使用Eclipse进行PHP的服务器端调试
  7. kylinH5框架之项目开发调试
  8. cf769D(枚举位或运算)
  9. Linux中find用法整理
  10. 【python】pyhton中的and
  11. Spark大数据技术与应用
  12. 分享一个我常用的信息差赚钱渠道
  13. 逻辑数据库设计 - 单纯的树(递归关系数据)
  14. Docker深入浅出系列
  15. PVE booting from Hard Disk
  16. java实现excel打印_java实现 excel 打印 问题
  17. 【C++】Lambda 表达式详解
  18. java unix时间戳_Java与Unix时间戳的相互转换
  19. 哪些些实验适合用计算机实测,计算机实测物理实验2014年讨论内容
  20. 【AI达人创造营第二期】基于PaddleClas的新冠肺炎CT影像的分类

热门文章

  1. 华硕服务器怎么装win7系统教程,华硕win7系统重装教程
  2. 分布式基站中的BBU和RRU
  3. ue4设置图片大小_UE4 相机拍照功能(图片保存)
  4. 什么是自然语言理解?自然语言理解的准则是什么?
  5. 机器人建模中移动关节如何建立坐标系_简述空间机器人运动学和动力学建模
  6. fastadmin 后台新增和编辑成功后刷新整个页面
  7. 三村合建水厂问题研究 (代码)
  8. 什么是Mirai僵尸网络
  9. 通过xml方式根据word模板导出word
  10. 使用ShareSDK实现QQ登录和分享操作