python代码下载m3u8视频
代码如下:
# -*- 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视频的更多相关文章
- Python 批量下载BiliBili视频 打包成软件
文章目录 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更加高深的知识.那么针对这三类人,我给大家 ...
- 下载m3u8视频
分两种情况 同时支持m3u8和mp4文件 某些视频同时支持m3u8和mp4视频文件,将m3u8改成mp4后直接: wget -c http://www.xxx.com/xxxx.mp4 只有m3u8视 ...
- 爬虫 | Python下载m3u8视频
目录 从 m3u8 文件中解析出 ts 信息 按时间截取视频 抓取 ts 文件 单文件测试 批量下载 合并 ts 文件 将合并的ts文件转化为视频文件 参考资料: m3u8格式介绍 ts文件格式介绍 ...
- python+fiddler下载vip视频 && ts视频可合并
如果你只想在线看视频可以去看这篇博客:python实现通过指定浏览器免费观看vip视频 先看一下我们程序运行的结果 我们要解析的接口就是(就是这个"接口+视频地址"可以解析出vi ...
- python爬虫下载小视频和小说(基础)
下载视频: 1 from bs4 import BeautifulSoup 2 import requests 3 import re 4 import urllib 5 6 7 def callba ...
- Python 爬虫实例(13) 下载 m3u8 格式视频
Python requests 下载 m3u8 格式 视频 最近爬取一个视频网站,遇到 m3u8 格式的视频需要下载. 抓包分析,视频文件是多个 ts 文件,什么是 ts文件,请去百度 ...
- (Python基础教程之二十二)爬虫下载网页视频(video blob)
Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...
- python采集A站m3u8视频格式视频
基本开发环境 (https://jq.qq.com/?_wv=1027&k=NofUEYzs) Python 3.6 Pycharm 相关模块的使用 (https://jq.qq.com/?_ ...
- 【python】下载中国大学MOOC的视频
[python]下载中国大学MOOC的视频 脚本目标: 输入课程id和cookie下载整个课程的视频文件,方便复习时候看 网站的反爬机制分析: 分析数据包的目的:找到获取m3u8文件的路径 1. 从第 ...
随机推荐
- ZooKeeper集群解析
ZooKeeper集群解析. 这篇文章中来介绍一下 ZooKeeper 相关的集群角色,还有 ZAB协议,集群的安装在 ZooKeeper入门 中有介绍. 一.ZooKeeper集群中的角色 Lead ...
- 图解 Redis | 不多说了,这就是 RDB 快照
大家好,我是小林. 虽说 Redis 是内存数据库. 但是它为数据的持久化提供了两个技术,分别是「 AOF 日志和 RDB 快照」. 这两种技术都会用各用一个日志文件来记录信息,但是记录的内容是不同的 ...
- Spring Boot开发RESTful接⼝服务及单元测试
Spring Boot开发RESTful接⼝服务及单元测试 常用注解解释说明: @Controller :修饰class,⽤来创建处理http请求的对象 @RestController :Spring ...
- ES6 数组的方法
数组的类 数组的类是Array 数组的定义 var arr=[元素] var arr=new Array(3) 数字3,代表有三个元素或者三个空位 如果数组定义采用 new 实例,类中跟的是一个数字 ...
- 第5章:资源编排(YAML)
5.1 编写YAML注意事项 YAML 是一种简洁的非标记语言. 语法格式: 缩进表示层级关系 不支持制表符"tab"缩进,使用空格缩进 通常开头缩进 2 个空格 字符后缩进 1 ...
- 从零玩转人脸识别之RGB人脸活体检测
从零玩转RGB人脸活体检测 前言 本期教程人脸识别第三方平台为虹软科技,本文章讲解的是人脸识别RGB活体追踪技术,免费的功能很多可以自行搭配,希望在你看完本章课程有所收获. ArcFace 离线SDK ...
- ExtJs4学习(五)最基本的Ext类
Ext类是ExtJs中最常见.最基础的一个类,它是一个全局对象,封装了所有类.单例和 Sencha 库所提供的实用方法. 大多数用户界面组件在一个较低的层次嵌套在命名空间中, 但是提供的许多常见的实用 ...
- java swagger ui 添加header请求头参数
我用到的swagger 主要有三款产品,swagger editor,swagger ui 和swagger codegen. swagger editor:主要是一个本地客户端,用来自己添加api, ...
- 解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题
解决数据库连接池连接mysql时,每隔8小时mysql自动断开所有连接的问题 最近有个问题非常讨厌,我们的工程中使用自己的连接池连接mysql数据库,可mysql数据库每隔8小时就会自动断开所有链接, ...
- Python+unittest+excel
接口测试设计思想: 框架结构如下: 目录如下: readme: config下的run_case_config.ini 文件说明: run_mode: 0:获取所有sheet页 1: if case_ ...