代码如下:

# -*- 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. springboot bean的循环依赖实现 源码分析

    springboot bean的循环依赖实现 源码分析 本文基于springboot版本2.5.1 <parent> <groupId>org.springframework. ...

  2. AS打包签名

    1.进入项目,然后点击菜单栏的Build  -->Generate  Signed APK... (如下图所示) 2.点击之后会出现下图,我这个是我以前有过KEY了,如果你以前没有过的话,都是空 ...

  3. Python基础之:Python的数据结构

    目录 简介 列表 列表作为栈使用 列表作为队列使用 列表推导式 del 元组 集合 字典 循环 简介 不管是做科学计算还是编写应用程序,都需要使用到一些基本的数据结构,比如列表,元组,字典等. 本文将 ...

  4. js笔记5

    1.逻辑运算 ||  &&  ! ||:遇到第一个为true的值就中止并返回 &&:遇到第一个为false的值就中止并返回,如果没有false值,就返回最后一个不是fa ...

  5. 二、JavaSE语言基础之常量与变量

    1.常量   所谓常量值的是数据处理过程中值不能更改的数据. 2.变量   所谓变量值的是运算过程中值可以改变的数据,类似于代数中的未知数.   在Java语言中,使用变量时必须遵循先定义,而后赋值, ...

  6. 17 DOS攻击防范

    #!/bin/bash source /etc/profile HOST_IP="172.16.1.122" DROP_IP_FILE="/tmp/drop_ip.log ...

  7. 42、sort命令

    排序和把相同的放到一起: 42.1.sort命令介绍: sort命令是一个排序介绍,简而言之就是以什么为分割符,对第几列进行什么排序操作: 42.2.sort命令参数介绍: -u #去重,会直接把重复 ...

  8. SonarQube 启动无报错但是拒绝访问的解决过程及方案

    启动sonarqube [sonar_user@Sonnarqube-dev linux-x86-64]$ ./sonar.sh start 查看网页: 排错步骤 第一步输入启动过程命令查看启动信息 ...

  9. Docker中容器的备份和恢复(可迁移)

    官方文档 备份容器 - save 查看镜像$ docker images 容器快照 - commit$ docker commit CONTAINER xxx/exampleimage-backup: ...

  10. 架构之:serverless架构

    目录 简介 什么是serverless serverless的例子 简单的三层服务 消息驱动 FaaS FaaS的缺点 FaaS的优点 总结 简介 不知道什么时候,出现了一个叫做Serverless架 ...