代码如下:

# -*- 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. 看完互联网大佬的「LeetCode 刷题手册」, 手撕了 400 道 Leetcode 算法题

    大家好,我是 程序员小熊 ,来自 大厂 的程序猿.相信绝大部分程序猿都有一个进大厂的梦想,但相较于以前,目前大厂的面试,只要是研发相关岗位,算法题基本少不了,所以现在很多人都会去刷 Leetcode ...

  2. 尝鲜一试,Azure静态网站应用服务(Azure Static Web Apps) 免费预览,协同Github自动发布静态SPA

    背景 最近在浏览微软的文档的时候发现,微软喜欢用Hugo这个文档框架,有些技术产品的文档页面就用Hugo来做的,同时搭配Github + Azure Static Web Apps Service这个 ...

  3. 陋居寡闻,初探Github CLI For Windows,开启命令行撸铁时代

    简介 gh is GitHub on the command line. It brings pull requests, issues, and other GitHub concepts to t ...

  4. .Net RabbitMQ实战指南——服务日志

    RabbitMQ的日出输入方式有很多种:file.console .syslog .exchange. 在RabbitMQ中,日志级别有none(0).critical(4).error(8).war ...

  5. Zabbix5.0微信报警

    3.1.注测企业微信: 3.2.企业微信注册成功后进入后台管理: 3.3.添加一个部门,并记住部门id: #我这里添加的子部门ID为2 3.4.添加一个用户到上面创建的部门里面(这里采取直接将管理员添 ...

  6. layui 合计行不要边框

    $(".layui-table-total div").attr('style','text-overflow:clip'); //合并合计行单元格 $(".layui- ...

  7. csu-acm 1503: 点到圆弧的距离

    1503: 点到圆弧的距离 分析: 先判断点和圆心的连线是否在圆弧范围内,如果在,最短距离即到圆心的距离减去半径的绝对值:反之,为到端点的最短距离. 具体看注释 #include <bits/s ...

  8. 学会这些CSS技巧让你写样式更加丝滑

    目录 1,前言 1,calc() 2,min() 3,max() 4,clamp() 5,gap 6,writing-mode 1,前言 记录一些很好用的css属性 1,calc() calc()函数 ...

  9. spring cloud服务器启动之后立刻通过zuul访问其中的实例报zuul连接超时的问题

    spring cloud服务启动之后,立刻进行调用 报错:com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: c ...

  10. Java实验项目二——二维数组实现九九乘法表

    Program:打印乘法口诀表 (1)编写一个方法,参数(二维数组),完成将二维数组中的数据按照行列显示的工作. (2)编写一个测试方法,给出99乘法表,放入到二维数组中,调用(1)中的方法,显示乘法 ...