代码如下:

# -*- coding: utf-8 -*-
import requests
import re
import os
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
BLOCK_SIZE = 16 # Byte def write_file(file_path, content, attr):
"""
写内容进文件
:param file_path:
:param content:
:param attr:
:return:
"""
with open(file_path, attr) as f:
f.write(content) def get_urls(m3u8_url):
"""
获取视频url
:param m3u8_url:
:return:
"""
# 分割url为文件和路径
remote_path, file_name = os.path.split(m3u8_url)
urls = []
try:
res = requests.get(url=m3u8_url)
url_regs = re.findall('#EXTINF:(.*?),\n(.*?)\n', res.text) # 正则提取url for url_reg in url_regs:
# 判断是否完整url
if 'http' not in url_reg[1]:
url = remote_path + "/" + url_reg[1]
urls.append(url)
# print(url)
else:
urls.append(url_reg[1])
print('【url获取完成】')
except Exception as e:
print(e)
print('【url获取失败】')
return urls def get_key(m3u8_url):
"""
获取解密密钥
:param m3u8_url:
:return:
"""
# 分割url为文件和路径
remote_path, file_name = os.path.split(m3u8_url)
key = None
try:
res = requests.get(url=m3u8_url)
key_regs = re.findall('#EXT-X-KEY:METHOD=(.*?),URI="(.*?)"', res.text) # 正则提取解密密钥
# 判断是否完整url
if 'http' not in key_regs[0][1]:
key_url = remote_path + '/' + key_regs[0][1]
else:
key_url = key_regs[0][1]
# 请求key
key = requests.get(url=key_url).content
print('【密钥获取完成】')
except Exception as e:
print(e)
print('【密钥获取失败】')
return key def download_video(m3u8_url, file_name):
"""
下载视频
:param m3u8_url:
:param file_name:
:return:
"""
# 记录已下载的数据大小,单位Byte
total = 0
try:
# 获取解密密钥
key = get_key(m3u8_url)
# 获取url
urls = get_urls(m3u8_url)
# 循环下载每个部分的视频
for url in urls:
print('【正在下载 '+url+' 部分的视频】')
res = requests.get(url=url)
# 解密
content = aes_decrypt(key, res.content)
total += len(content)
# 追加进文件
write_file(file_name, content, 'ab+')
print('【下载完成 ' + url + ' 部分的视频】')
print('【已下载部分大小:'+str(total/1024)+' kb/'+str(total/(1024*1024))+' mb】')
print('【下载完成】')
except Exception as e:
print(e) def aes_decrypt(key, crypt_content):
"""
解密
:param key:
:param crypt_content:
:return:
"""
cryptor = AES.new(key, AES.MODE_CBC, key)
pad_content = pad(crypt_content, BLOCK_SIZE)
# print(len(crypt_content))
return unpad(cryptor.decrypt(crypt_content), BLOCK_SIZE)
# return cryptor.decrypt(crypt_content) def aes_encrypt(key, text):
"""
加密
:param key:
:param text:
:return:
"""
cryptor = AES.new(key, AES.MODE_CBC, key)
return cryptor.encrypt(pad(text.encode(), BLOCK_SIZE))
# return cryptor.encrypt(text.encode()) def main():
download_video('http://1252524126.vod2.myqcloud.com/9764a7a5vodtransgzp1252524126/69f662df5285890816956396169/drm/v.f146750.m3u8', 'test.mp4')
# print(get_key('https://1252524126.vod2.myqcloud.com/9764a7a5vodtransgzp1252524126/430c15b95285890816864188760/drm/v.f146750.m3u8')) if __name__ == '__main__':
main()

python代码下载m3u8视频的更多相关文章

  1. Python 批量下载BiliBili视频 打包成软件

    文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...

  2. 下载m3u8视频

    分两种情况 同时支持m3u8和mp4文件 某些视频同时支持m3u8和mp4视频文件,将m3u8改成mp4后直接: wget -c http://www.xxx.com/xxxx.mp4 只有m3u8视 ...

  3. 爬虫 | Python下载m3u8视频

    目录 从 m3u8 文件中解析出 ts 信息 按时间截取视频 抓取 ts 文件 单文件测试 批量下载 合并 ts 文件 将合并的ts文件转化为视频文件 参考资料: m3u8格式介绍 ts文件格式介绍 ...

  4. python+fiddler下载vip视频 && ts视频可合并

    如果你只想在线看视频可以去看这篇博客:python实现通过指定浏览器免费观看vip视频  先看一下我们程序运行的结果 我们要解析的接口就是(就是这个"接口+视频地址"可以解析出vi ...

  5. python爬虫下载小视频和小说(基础)

    下载视频: 1 from bs4 import BeautifulSoup 2 import requests 3 import re 4 import urllib 5 6 7 def callba ...

  6. Python 爬虫实例(13) 下载 m3u8 格式视频

    Python  requests  下载  m3u8 格式    视频 最近爬取一个视频网站,遇到  m3u8 格式的视频需要下载. 抓包分析,视频文件是多个  ts 文件,什么是 ts文件,请去百度 ...

  7. (Python基础教程之二十二)爬虫下载网页视频(video blob)

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  8. python采集A站m3u8视频格式视频

    基本开发环境 (https://jq.qq.com/?_wv=1027&k=NofUEYzs) Python 3.6 Pycharm 相关模块的使用 (https://jq.qq.com/?_ ...

  9. 【python】下载中国大学MOOC的视频

    [python]下载中国大学MOOC的视频 脚本目标: 输入课程id和cookie下载整个课程的视频文件,方便复习时候看 网站的反爬机制分析: 分析数据包的目的:找到获取m3u8文件的路径 1. 从第 ...

随机推荐

  1. split截取字符串

    一.根据单个分隔字符用split截取字符串:string st="GT123_1";split代码:string[] sArray=st.split("_"); ...

  2. Echarts中X轴坐标太密集,分段显示

    在axisLabel中设置刻度间隔interval,再加上强制显示最大值showMaxLabel和最小值showMinLabel axisLabel: {//X轴文字 interval: day == ...

  3. 12、关于系统cpu的计算

    1.cpu核数和逻辑cpu: CPU总核数 = 物理CPU个数 * 每颗物理CPU的核数: 总逻辑CPU数 = 物理CPU个数 * 每颗物理CPU的核数 * 超线程数 2.查看linux的cpu相关信 ...

  4. .net获取项目根目录方法集合

    这篇文章是别的博客复下来,收藏的: 编写程序的时候,经常需要用的项目根目录.自己总结如下 1.取得控制台应用程序的根目录方法     方法1.Environment.CurrentDirectory ...

  5. 基于Redis的分布式锁设计

    前言 基于Redis的分布式锁实现,原理很简单嘛:检测一下Key是否存在,不存在则Set Key,加锁成功,存在则加锁失败.对吗?这么简单吗? 如果你真这么想,那么你真的需要好好听我讲一下了.接下来, ...

  6. centos 8 安装 SonarQube遇到的启动问题及解决方案

    查看当前centos操作系统的版本 cat /etc/redhat-release 执行结果: 第一步安装openjdk,版本可以根据自己安装sonarqube的版本而定: 安装过程可参见我的另一篇博 ...

  7. DRF之过滤排序分页异常处理

    一.过滤 对于列表数据要通过字段来进行过滤,就需要添加 django-filter 模块 使用方法: # 1.注册,在app中注册 settings.py INSTALLED_APPS = [ 'dj ...

  8. Shell脚本对Linux进行文件校验

    Shell脚本对Linux进行文件校验 一.需求 有客户等保需求对文件一致性进行校验,想到利用md5sum工具,因此写脚本来对文件进行自定义扫描,后期可以利用其进行校验,快速校验文件发现变更的文件,一 ...

  9. ROS2学习之旅(4)——理解ROS2 Graph中的节点

    ROS(2)图(ROS(2) graph)是一个同时处理数据的基于ROS2元素的网络,它包含了所有的可执行文件以及它们之间的连接.图中的基本元素包括:节点(nodes).话题(topics).服务(s ...

  10. 利用bmob平台,使用云端逻辑在Xcode上实现用户注册、登录

    思路:bmob上构建云端逻辑,xcode通过http请求来在不引入bmob SDK的情况下,远程操作bmob上构建的数据库,实现注册.登录. xcode导入 AFNetWorking--------- ...