Python3 根据m3u8下载视频,批量下载ts文件并且合并

Python3 根据m3u8下载视频,批量下载ts文件并且合并

m3u8是苹果公司推出一种视频播放标准,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少I/o访问次数,一般存在服务器的内存中),通过m3u8解析出来路径,然后去请求,是现在比较流行的一种加载方式,诸如腾讯视频之类大多都是切割成ts流进行加载。

示例代码:

import os, shutil
import urllib.request, urllib.error, requests

# 打开并读取网页内容
def getUrlData(url):
    try:
        urlData = urllib.request.urlopen(url, timeout=20)  # .read().decode(‘utf-8‘, ‘ignore‘)
        return urlData
    except Exception as err:
        print(f‘err getUrlData({url})\n‘, err)
        return -1

# 下载文件-urllib.request
def getDown_urllib(url, file_path):
    try:
        urllib.request.urlretrieve(url, filename=file_path)
        return True
    except urllib.error.URLError as e:
        # hasttr(e, ‘code‘),判断e 是否有.code属性,因为不确定是不是HTTPError错误,URLError包含HTTPError,但是HTTPError以外的错误是不返回错误码(状态码)的
        if hasattr(e, ‘code‘):
            print(e.code)  # 打印服务器返回的错误码(状态码),如403,404,501之类的
        elif hasattr(e, ‘reason‘):
            print(e.reason)  # 打印错误原因

def getVideo_urllib(url_m3u8, path, videoName):
    print(‘begin run ~~\n‘)
     # urlData = getUrlData(url_m3u8).readlines()
    urlData = getUrlData(url_m3u8)
    num = 0
    tempName_video = os.path.join(path, f‘{videoName}.ts‘)  # f‘{}‘ 相当于‘{}‘.format() 或 ‘%s‘%videoName
    # print(urlData)
    for line in urlData:
        # 解码,由于是直接使用了所抓取的链接内容,所以需要按行解码,如果提前解码则不能使用直接进行for循环,会报错
        # 改用上面的readlines()或readline()也可以,但更繁琐些,同样需要按行解码,效率更低
        url_ts = line.decode(‘utf-8‘)
        tempName_ts = os.path.join(path, f‘{num}.ts‘)  # f‘{}‘ 相当于‘{}‘.format()
        if not ‘.ts‘ in url_ts:
            continue
        else:
            if not url_ts.startswith(‘http‘):  # 判断字符串是否以‘http‘开头,如果不是则说明url链接不完整,需要拼接
                # 拼接ts流视频的url
                url_ts = url_m3u8.replace(url_m3u8.split(‘/‘)[-1], url_ts)
        print(url_ts)
        getDown_urllib(url_ts, tempName_ts)  # 下载视频流
        if num == 0:
            # 重命名,已存在则自动覆盖
            shutil.move(tempName_ts, tempName_video)
            num += 1
            continue
        cmd = f‘copy /b {tempName_video}+{tempName_ts} {tempName_video}‘
        res = os.system(cmd)
        if res == 0:
            os.system(f‘del {tempName_ts}‘)
            if num == 20:  # 限制下载的ts流个数,这个视频挺长有四百多个.ts文件,所以限制一下
                break
            num += 1
            continue
        print(f‘Wrong, copy {num}.ts-->{videoName}.ts failure‘)
        return False
    os.system(f‘del {path}/*.ts‘)  # 调用windows命令行(即cmd)工具,运行命令
    filename = os.path.join(path, f‘{videoName}.mp4‘)
    shutil.move(tempName_video, filename)
    print(f‘{videoName}.mp4 finish down!‘)

if __name__ == ‘__main__‘:
    url_m3u8 = ‘http://wscdn.alhls.xiaoka.tv/201886/2f5/75a/HoHdTc1LjUaBjZbJ/index.m3u8‘
    path = r‘E:\pydevworkspaces\project\product\epgw\videos‘
    videoName = url_m3u8.split(‘/‘)[-2]
    getVideo_urllib(url_m3u8, path, videoName)

注:(1)仅限windows下使用,如果要在Linux上使用需要修改合并命令;

(2)修改文件名时,特意选择shutil模块(可以看作os的高级版)的move方法,虽然move主要是用来移动文件的,重命名算是附带的,不过强制覆盖的特点在这里很有用,避免中断后重新下载时重命名产生异常。

原文地址:https://www.cnblogs.com/lizm166/p/10262394.html

时间: 2024-10-11 00:36:05

Python3 根据m3u8下载视频,批量下载ts文件并且合并的相关文章

JAVA SFTP文件上传、下载及批量下载

1.jsch官方API查看地址(附件为需要的jar) http://www.jcraft.com/jsch/ 2.jsch简介 JSch(Java Secure Channel)是一个SSH2的纯Java实现.它允许你连接到一个SSH服务器,并且可以使用端口转发,X11转发,文件传输等,当然你也可以集成它的功能到你自己的应用程序. SFTP(Secure File Transfer Protocol)安全文件传送协议.可以为传输文件提供一种安全的加密方法.SFTP 为 SSH的一部份,是一种传输

python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频

最近发现一些网站,可以解析各大视频网站的vip.仔细想了想,这也算是爬虫呀,爬的是视频数据. 首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 "一出好戏" . 分析页面 我用的是chrome浏览器,F12进入查看.选择NetWork的Doc,发现主体部分的数据是从这个网站获取的. 在地址栏输入这个链接,跳转到了视频来源的播放页面. 当然,在这个页面就可以直接观看视频了,但是我们要把视频下载下来. 寻找视频文件 仍然是之前那个页面,在Other中,我们发现了一些奇怪的

爬虫登陆极客学院,并下载视频

首先说明:这个代码不是免费下载视频,需要你有vip账号 只是方便大家批量下载 不过体验vip也很好获得,有了体验机会赶紧用这个批量下载吧 完整代码在这:我的github 只需要修改最下面的存储地址和需要下载的页面,就可以将一个页面中的课程的所有视频批量下载到指定文件夹 主要是登陆网站这一块废了些时间,简要说一下登陆模块: 首先必须有下面这一部分代码,意思是给urlopen()函数加上cookie处理,否则是不会处理cookie的,但是网站记录我们是谁就是靠cookie的,没有这个那么就无法登陆,

批量下载ts视频文件

第一步 使用chrome 按F12进入开发模式,拖动视频进度条到视频结束: 然后找到.m3u8以结尾的文件并保存为文本文件. 第二步 点开查看里面是否存在如下以ts结尾的文件内容 ...... /20180802/eXLFMdky/800kb/hls/QV7N1B14122999.ts/20180802/eXLFMdky/800kb/hls/QV7N1B14123000.ts/20180802/eXLFMdky/800kb/hls/QV7N1B14123001.ts ...... 第三步 找到一

python3.4爬虫批量下载音乐

最近在学习python,使用的版本为python3.4,开发环境为使用Pydev插件的eclipse.正好觉得http://www.dexiazai.com/?page_id=23上的音乐不错,决定使用python批量下载下来. 1.音乐地址 经过分析,页面嵌入的虾米播放器中的地址如下,后面以逗号分隔的字符为音乐的id,如音乐的地址为http://www.xiami.com/song/2088578 <span style="font-size:14px;"><spa

批量下载慕课网视频

慕课网(http://www.imooc.com/)上有很多不错的视频,当然我不是来给慕课网打广告的,我本人学习过很多慕课网上的免费的视频. 在线看如果网速慢时,可能会有卡顿,没网时无法观看.所有说下载到本地,离线看视频是非常不错的选择.慕课网上没提供下载视频的入口,想下载到本地怎么办? 如果一次下载一个视频,那是very very easy,不用第三方工具就双腿搞定. 1.打开谷歌或谷歌内核的浏览器,按F12键,打开开始人员工具,地址栏输入http://www.imooc.com/video/

利用Python实现批量下载腾讯视频!

导语 利用Python下载腾讯非VIP视频,也就是可以免费观看的视频.做这个的起因是最近在看一个叫"请吃红小豆吧"的动漫,一共三分钟的动漫,广告时间竟然要一分钟,实在忍无可忍,于是干脆写个脚本把动漫都先下载下来再看,顺便过来分享一波,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: PIL模块: requests模块: click模块: 以及一些Python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 做之前

python爬虫公众号所有信息,并批量下载公众号视频

前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 数据分析实战 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef 主要功能 如何简单爬虫微信公众号 获取信息:标题.摘要.封面.文章地址 自动批量下载公众号内的视频 一.获取公众号信息:标题.摘要.封面.文章U

批量修改bilibili客户端下载视频文件名

代码已上传:Github 起因 昨天晚上从B站电脑客户端下了一个分集视频 但是下载后的视频是这样的: 视频名是这样的: 这样既不直观又不美观,就算把视频文件放到一个文件夹内,连续看视频时也不容易记住看到哪个.所以就有了今天的事情. 经过 起初,我的想法是复制出来一个一个该文件名,但是当时我想到,作为一个优秀的程序员,怎么能干这种无脑的活呢???(其实是太懒了...) 于是,,,就去百度了,百度确实找到一个,但是上面的方法根本没有写全,虽然我已经尽力补全,但是他还是漏了一个非常关键的一步,所以我就