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. 从第 ...
随机推荐
- ANDROID开发之OOM:一张图片(BitMap)占用内存的计算 图片内存优化
Android中一张图片(BitMap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数. 一张图片(BitMap)占用的内存=图片长度*图片宽度*单位像素占用的字节数 注: ...
- Java-Lambda相关使用介绍
频繁使用的语句 Lambda又涉及到comparator和comparable区别(Comparable是实现comparable接口,实现后可以使用Collections.sort或Arrays ...
- delphi xe 10.3 利用Git组群开发,Git服务器安装,Git 拉取,提交,推送相关设置操作
1. Git服务器安装, 参考 https://blog.csdn.net/u012842630/article/details/97175397 Git服务器官方网站,要FQ. 2. 工具软件 gi ...
- redis字典快速映射+hash釜底抽薪+渐进式rehash | redis为什么那么快
前言 相信你一定使用过新华字典吧!小时候不会读的字都是通过字典去查找的.在Redis中也存在相同功能叫做字典又称为符号表!是一种保存键值对的抽象数据结构 本篇仍然定位在[redis前传]系列中,因为本 ...
- 5、mysql_sql语言介绍
5.1.什么是sql: 总结:sql语句是关系型数据库的结构化查询和程序设计语言: 5.2.sql的分类: 1.数据库查询语言(DQL): select user,host,password from ...
- 其他:IntelliJ IDEA设置运行内存
1. 打开idea的安装路径,进去bin目录 2. 修改idea.exe.vmoptions 将idea内存设置为-Xms512m -Xmx2048m -XX:ReservedCodeCacheS ...
- Spring WebFlux快速上手——响应式Spring的道法术器
https://blog.csdn.net/get_set/article/details/79480233
- Python网页正文转换语音文件的操作方法
天气真的是越来越冷啦,有时候我们想翻看网页新闻,但是又冷的不想把手拿出来,移动鼠标翻看.这时候,是不是特别想电脑像讲故事一样,给我们念出来呢?人生苦短,我有python啊,试试用 Python 来朗读 ...
- centos安装报错:license information (license not accepted)
前言:在最近部署的centos系统发现个问题 出现报错:安装配置完成后,重启虚拟机出现license information (license not accepted) 截图: 解决方案: 在界 ...
- Flask(10)- 标准类视图
前言 前面文章讲解 Flask 路由的时候,都是将 URL 路径和一个视图函数关联 当 Flask 框架接收到请求后,会根据请求 URL,调用响应的视图函数进行处理 Flask 不仅提供了视图函数来处 ...