首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >ts 视频下载[通俗易懂]

ts 视频下载[通俗易懂]

作者头像
全栈程序员站长
发布于 2022-09-09 02:26:30
发布于 2022-09-09 02:26:30
93300
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import urllib.request
import requests, os, threading
from Crypto.Cipher import AES
from src.Pacho.moviePa.tsdownload import aes_decode

class m3u8down(object):
    def __init__(self, url, listheaders, dicheaders):
        self.url = url  # 这里的url是index.m3u8地址
        self.headers = listheaders
        self.header = dicheaders
        self.ts_parts = []
        self.down_path = 'D:/workspace/download/Mp4'
        self.tsthreads = []
        self.key = None

    def aes_decode(self, data, key):
        """AES解密
        :param key:  密钥(16.32)一般16的倍数
        :param data:  要解密的数据
        :return:  处理好的数据
        """
        cryptor = AES.new(key, AES.MODE_CBC, key)
        plain_text = cryptor.decrypt(data)
        return plain_text.rstrip(b'\0')  # .decode("utf-8")

    def to_ts(self):
        requests.packages.urllib3.disable_warnings()
        content_all = requests.get(self.url, verify=False, timeout=200).text
        if "#EXTM3U" not in content_all:
            raise BaseException("非M3U8的链接")
        if "EXT-X-VERSION" in content_all:
            file_line = content_all.split("\n")
            # print(file_line)
            self.get_tsurls(self.url, file_line)

    def get_tsurls(self, m3u8url, lines):
        for index, line in enumerate(lines):  # m3u8文件中有ts,获取ts地址并添加索引
            if "EXTINF" in line:  # 找ts地址
                if "/" not in lines[index + 1]:  # 判断.ts是否是路径 'DjbgADY7468014.ts' or '/20181221/.../VRYKBY4319009.ts'
                    ts_url = m3u8url.rsplit("/", 1)[0] + "/" + lines[index + 1]  # 拼出ts片段的URL
                else:
                    ts_url = m3u8url.rsplit("/", 1)[0] + "/" + lines[index + 1].rsplit("/", 1)[-1]  # 拼出ts片段的URL
                self.ts_parts.append(ts_url)
            if "#EXT-X-KEY" in line:
                # #EXT-X-KEY:METHOD=AES-128,URI="encryption.key"
                key_url = m3u8url.rsplit("/", 1)[0] + "/" + line.split('"')[1]
                self.key = requests.get(url=key_url, timeout=120, headers=self.header).content  # 获取秘钥

    def load_ts(self, ts_url, files, count):
        if self.key:
            self.auto_keydown(ts_url, files, self.header, self.key)
        else:
            self.auto_down(ts_url, files, self.headers)
        print('第 %d/%d 个文件下载完成, 下载地址是%s' % (count, len(self.ts_parts), ts_url))
        count += 1


    def auto_down(self, url, filename, headers):  # 下载失败后,自调用从新下载
        try:
            opener = urllib.request.build_opener()  # 创建opener对象
            opener.addheaders = self.headers
            urllib.request.install_opener(opener)  # 将opener对象装入urllib.request
            urllib.request.urlretrieve(url, filename)
        except Exception as ex:
            # print(ex.args, url)
            return self.auto_down(url, filename, headers)

    def auto_keydown(self, url, filename, headers, key):  # 下载失败后,自调用从新下载
        try:
            response = requests.get(url=url, timeout=120, headers=headers)
            with open(filename, 'ab+') as f:
                data = aes_decode(response.content, key)
                f.write(data)
                f.close()
        except Exception as ex:
            # print(ex.args, url)
            return self.auto_down(url, filename, headers, key)

    def threads(self):
        for i in range(len(self.ts_parts)):
            files = self.down_path + '/' + 'tsm{:0>5}.ts'.format(i)
            if os.path.exists(files):  # 判断文件是已下载,且文件大小变为空。是则结束本次循环,继续循环
                sz = os.path.getsize(files)
                if not sz:
                    os.remove(files)  # 删除空文件
                    print("删除空字节视频文件", files.rsplit("/", 1)[-1])
                else:
                    continue
            t = threading.Thread(target=self.load_ts, args=(self.ts_parts[i], files, i))
            self.tsthreads.append(t)

def main():  # This is m3u8 url
    url = 'https://www.XXXXX.com/20200612/jDCLCWyb/1500kb/hls/index.m3u8'

    hd = [('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1941.0 Safari/537.36')]
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
        "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive",
        "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2"} 

    m3u8 = m3u8down(url, hd, headers)
    m3u8.to_ts()
    m3u8.threads()

    for th in m3u8.tsthreads:
        th.start()

    for th in m3u8.tsthreads:
        th.join()

    print("{:-^20}".format("下载结束"))

if __name__ == '__main__':
    main()

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161206.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python实战:分析网站的m3u8文件下载ts文件并解密
这个文章默认读者已了解m3u8的相关知识,包括如何在浏览器中查找m3u8文件的url和ts文件的下载地址;
JQ实验室
2023/04/06
2.6K0
Python下载M3U8加密视频示例[通俗易懂]
最近看到几个视频网站的地址依然是m3u8格式,不禁有了使用python进行下载的想法,虽然下载m3u8格式视频的工具很多,但如果我们自行编码就能应对更多的情况。
全栈程序员站长
2022/07/02
4.1K0
Python下载M3U8加密视频示例[通俗易懂]
python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频「建议收藏」
一些网站会提供m3u8视频地址,以供下载观看。或者一些网站经过分析后发现是使用m3u8格式进行播放的,这时使用m3u8的地址链接就可以下载到相应的视频。
全栈程序员站长
2022/09/07
4.9K0
python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频「建议收藏」
Python爬虫进阶之爬取某视频并下载的实现
意外的挖掘到了一个资源网站(你懂得),但是网速慢广告多下载不了种种原因让我突然萌生了爬虫的想法。
python学习教程
2020/12/16
2.4K1
Python爬虫进阶之爬取某视频并下载的实现
python3爬虫(4)各种网站视频下载
理论上来讲只要是网上(浏览器)能看到图片,音频,视频,都能够下载下来,然而实际操作的时候也是有一定难度和技术的,这篇文章主要讲述各个网站视频资源如何下载。
py3study
2020/01/13
3.1K0
Spider实战系列-抓取《某人之下第三季》
一个视频就几百兆到几十G不等  这种视频往往不会由一个连接进行全部返回  视频是由多个片段组成的每个片段大概是几秒到几分钟
浅辄
2023/03/06
1.3K0
Spider实战系列-抓取《某人之下第三季》
实战模拟│使用多进程教你下载 m3u8 加密或非加密视频「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161227.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/09
2K0
使用 Python 下载 B 站视频
B 站,一个月活用户达到 1.72 的视频网站,有时候会因为某些未知的原因导致放入收藏夹的视频失效,为了防止视频被和谐、被失效,身为 Pythonista 来撸一个 B 站的视频下载器。
用户8544541
2022/01/27
8921
使用 Python 下载 B 站视频
在线视频的5种下载办法
最简单的办法,就是利用各种网盘搜索,找到网盘的分享地址,转存到自己的网盘,然后下载。这样就避免了从在线视频网站直接下载,而且常常清晰度比较高。
全栈程序员站长
2022/09/07
4.9K0
Python3 网络爬虫(四):视频下载,那些事儿!
「you-get」支持各大视频网站的视频下载,国内外加起来近 80 家。像国内的爱奇艺、腾讯视频、抖音、快手、B站、A站,国外的 Youtube、Twitter、TED、Instagram等等。
Jack_Cui
2020/05/18
6.7K0
Python3 网络爬虫(四):视频下载,那些事儿!
python爬取视频网站m3u8视频,下
最近发现一些网站,可以解析各大视频网站的vip。仔细想了想,这也算是爬虫呀,爬的是视频数据。
py3study
2020/01/19
3.5K0
python爬取视频网站m3u8视频,下
python知识点100篇系列(18)-解析m3u8文件的下载视频
m3u8文件一般可以直接在浏览器里找到,打开目标视频播放页面,按F12打开开发者模式
JQ实验室
2024/10/09
3520
python 下载m3u8视频「建议收藏」
有一个朋友,通过一个网站(https://leetcode-cn.com/problems/course-schedule/solution/ke-cheng-biao-by-leetcode-solution/),看到一个视频,感觉不错,就想下载下来,可是下载不了,然后就求助与我,(此处省略一万字废话。。。)下面进入正题。
全栈程序员站长
2022/08/31
2.9K0
python 下载m3u8视频「建议收藏」
Python爬虫:爬取美拍小姐姐视频
  最近在写一个应用,需要收集微博上一些热门的视频,像这些小视频一般都来自秒拍,微拍,美拍和新浪视频,而且没有下载的选项,所以只能动脑想想办法了。
py3study
2020/01/19
1.8K0
Python爬虫:爬取美拍小姐姐视频
多线程视频批量下载
前一阵子我的一个好哥们小海知道我转行学了计算机,想要我帮忙下载某个网站的视频(因其只能在线观看,而且播放不够流畅~),本着男人不能说不行的原则,于是便有了本文。
老肥码码码
2020/01/17
1.9K0
多线程视频批量下载
强迫症终结版 - 蹩脚梨视频下载器(很菜勿喷)
强迫症终结版 - 蹩脚梨视频下载器 支持功能: 自己选择要下载的视频分类 视频个数(12的倍数,最新的...个)(不要怪不能高度自定义啦~) 重复文件自动跳过 菜单会被控制台打印顶掉,大家见谅(
suwanbin
2019/11/28
4020
爬虫案例分析_爬虫爬取司法案例
小番在这里 这里涉及了一些反爬手段与方法,爱学习的老铁们赶紧拿起小板凳开始听了
全栈程序员站长
2022/09/25
3400
爬虫案例分析_爬虫爬取司法案例
Python抓取腾视频所有电影,不用钱就可以看会员电影
实现对腾讯视频目标url的解析与下载,由于第三方vip解析,只提供在线观看,隐藏想实现对目标视频的下载
Python小二
2022/08/24
1.9K0
Python抓取腾视频所有电影,不用钱就可以看会员电影
手把手教你使用Python网络爬虫获取亚马逊商品页面的m3u8格式视频
前几天在Python最强王者交流群有个叫【顽皮Dolly】的粉丝问了一个Python网络爬虫的问题,抓取亚马逊商品视频,这里拿出来给大家分享下,一起学习下。
Python进阶者
2022/04/12
8430
手把手教你使用Python网络爬虫获取亚马逊商品页面的m3u8格式视频
Python爬虫(全)
里面的parse方法,这个方法有两个作用 1.负责解析start_url下载的Response 对象,根据item提取数据(解析item数据的前提是parse里全部requests请求都被加入了爬取队列) 2.如果有新的url则加入爬取队列,负责进一步处理,URL的Request 对象 这两点简单来说就是编写爬虫的主要部分
yuanshuai
2022/08/22
13.3K0
Python爬虫(全)
推荐阅读
相关推荐
python实战:分析网站的m3u8文件下载ts文件并解密
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验