前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >多线程视频批量下载

多线程视频批量下载

作者头像
老肥码码码
发布于 2020-01-17 03:30:25
发布于 2020-01-17 03:30:25
1.9K00
代码可运行
举报
运行总次数:0
代码可运行

前一阵子我的一个好哥们小海知道我转行学了计算机,想要我帮忙下载某个网站的视频(因其只能在线观看,而且播放不够流畅~),本着男人不能说不行的原则,于是便有了本文。

声明:本文仅供技术交流,主要使用requests,threading,os,re等库,并且使用FFmpeg进行视频的合并。

01.获取视频播放链接

首先需要获取视频播放链接,打开视频页面,查看网页源代码,利用XPath便可轻易的获取视频标题以及播放链接。

02.获取m3u8文件

HTTP Live Streaming(HLS)是一个由苹果公司提出的基于HTTP的流媒体网络传输协议。而HLS的m3u8,是一个ts的列表,其中ts是一种视频的封装格式。简单来说,整个视频是通过一个一个ts连续播放展示出来的。因此我们需要获取这个m3u8文件,从而得到所有的ts文件链接。

那么我们如何得到这个m3u8文件呢?经过观察,这个链接可以在视频播放页面的源代码中看到一丝端倪。

这个share链接打开之后可以看到m3u8文件的url链接,可以通过简单的正则表达式将其匹配。得到连接之后,我们就可以通过requests把这个m3u8文件下载到本地。

03.批量下载ts文件

根据下载的m3u8文件,加上url的前缀,便可获得ts文件的完整url连接,因为往往一个视频包含几百乃至上千个ts文件,这时多线程就派上了用场。

threading的使用可以大大加快下载的速度,由于电脑配置的限制,多线程的数目需要控制,不然就会频繁报错,甚至程序崩溃。经过测试,按100个线程同时开启,下载会非常稳健~ 所以我将ts文件按100个一组分类,最后不到100个分为一组。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def main(self):
               
        self.get_shrae_url()
        self.check_folder('m3u8')
        for i in range(len(self.m3u8_urls)):
            os.chdir(self.retval)
            files,files_url=self.get_files(i)
            print("*****************开始下载'{}',该视频共有{}个ts文件*****************".format(self.titles[i],len(files)))
            segs=len(files)//100 
            for seg in range(segs+1):
                tasks=[]           # 线程池
                left=100*seg
                right=left+100 if seg!=segs else len(files)
                for j in range(left,right):
                    task=threading.Thread(target=self.run, args=(i,files[j],files_url[j],))
                    tasks.append(task)
                    task.start()
                time.sleep(1)
        
                # 等待所有线程完成
                for _ in tasks:
                    _.join() 
                print("*****************已经完成{}个ts文件下载!*****************".format(right))
            print("*****************{}的所有ts文件已经完成下载!*****************".format(self.titles[i]))
            
            self.merge(i)
            self.delete(files)
        
    def run(self,i,file,file_url):
        
        ts_file_folder=self.titles[i]
        try:      
            if os.path.exists('{}/{}'.format(ts_file_folder,file)):
                pass
            else:
                r=requests.get(file_url,headers=self.headers)
                with open('{}/{}'.format(ts_file_folder,file),'wb') as f:
                    f.write(r.content)        
            print("{}已下载".format(file))
    
        except Exception as e:
            print(str(e))
            print("出现异常,正在自动重新下载!")
            self.run(i,file,file_url)

04.ts合并成mp4

FFmpeg的视音频编解码功能非常太强大,几乎囊括了现存所有的视音频编码标准。因此我们通过其来将我们之前获取的ts文件合并成完整的mp4视频文件。

合并方法主要有两种,一是直接将需要合并的文件名通过“|”分隔

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ffmpeg -i "concat:1.ts|2.ts" -c copy output.mp4

我采取了另外一种方法,编辑一个txt文本文件,罗列需要合并的子文件路径和名称,每一行的最前面需要加上“file”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ffmpeg -f concat -i temp.txt -c copy output.mp4

利用os.system执行合并命令,其中要注意路径的问题,ffpmeg命令执行后在当前路径生成mp4文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def merge(self,i):
        
        time.sleep(3)
        # 合并ts文件
        os.chdir("{}/".format(self.titles[i]))
        shell_str='ffmpeg -f concat -i temp.txt -c copy {}.mp4'.format(self.titles[i])    
        # print(shell_str)
        os.system(shell_str)
        print("*****************视频'{}'合并成功*****************".format(self.titles[i]))

05.删除所有ts文件

当视频完成合并之后,ts文件比较占据空间,我们需要将它们批量删除。这里files是所有的ts文件名的列表。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def delete(self,files):
        
        for file in files:
            if os.path.exists(file):
                os.remove(file)
        print("*****************已删除所有ts文件!*****************")

知道了一个视频是如何下载的,批量下载多个视频便可信手拈来了。小海在体验高速视频下载之后,投来了羡慕的目光~

什么?你们只想要代码?后台回复“视频”即可

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与数据之美 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
百行代码轻松爬取视频
最近老肥在追剧,遇到了不是VIP无法畅享剧集的小困难。然后我在某强大的搜索引擎中发现了一个视频网站,该网站涵盖了各大热门视频,与VIP的更新速度同步,并且无需等待广告。
老肥码码码
2020/08/07
1.3K0
在线视频的5种下载办法
最简单的办法,就是利用各种网盘搜索,找到网盘的分享地址,转存到自己的网盘,然后下载。这样就避免了从在线视频网站直接下载,而且常常清晰度比较高。
全栈程序员站长
2022/09/07
4.9K0
python知识点100篇系列(18)-解析m3u8文件的下载视频
m3u8文件一般可以直接在浏览器里找到,打开目标视频播放页面,按F12打开开发者模式
JQ实验室
2024/10/09
3100
ts视频下载 准备下载视频的你确定不进来看看吗
之前一直爬取的内容都是完整的文件,例如一整个mp3或则mp4,但是目前很多视频网站都开始采用ts流媒体视频的方式进行视频的展示,不知道你有没有这样的体验,兴致勃勃的打开一个电影网站,准备开始施展爬虫大法 查看xhr请求之后,本以为可以找到一个返回mp4的接口,没想到返回的是这一堆ts文件
小王不头秃
2024/06/19
6960
ts视频下载 准备下载视频的你确定不进来看看吗
python实战:分析网站的m3u8文件下载ts文件并解密
这个文章默认读者已了解m3u8的相关知识,包括如何在浏览器中查找m3u8文件的url和ts文件的下载地址;
JQ实验室
2023/04/06
2.5K0
手把手教你使用Python网络爬虫获取亚马逊商品页面的m3u8格式视频
前几天在Python最强王者交流群有个叫【顽皮Dolly】的粉丝问了一个Python网络爬虫的问题,抓取亚马逊商品视频,这里拿出来给大家分享下,一起学习下。
Python进阶者
2022/04/12
8240
手把手教你使用Python网络爬虫获取亚马逊商品页面的m3u8格式视频
如何下载优酷 m3u8 格式的视频文件?
mp4 平常最熟悉的视频文件格式就是mp4了,比如这个微博视频就是mp4格式https://weibo.com/tv/v/I6NlI3XNO?fid=1034:4416174394388093 通过
苏生不惑
2019/09/17
9.5K0
如何下载优酷 m3u8 格式的视频文件?
Python下载M3U8加密视频示例[通俗易懂]
最近看到几个视频网站的地址依然是m3u8格式,不禁有了使用python进行下载的想法,虽然下载m3u8格式视频的工具很多,但如果我们自行编码就能应对更多的情况。
全栈程序员站长
2022/07/02
4K0
Python下载M3U8加密视频示例[通俗易懂]
Python爬虫进阶之爬取某视频并下载的实现
意外的挖掘到了一个资源网站(你懂得),但是网速慢广告多下载不了种种原因让我突然萌生了爬虫的想法。
python学习教程
2020/12/16
2.3K1
Python爬虫进阶之爬取某视频并下载的实现
网页视频下载(TS流下载合成)
最近《流浪地球》比较火,想找资源下载看看,无奈只找到了网址 http://m.tlyy.tv/ ,但是我的chrome插件也嗅探不到网页上的视频。。于是乎,右击页面,inspect 走起…
全栈程序员站长
2022/09/09
3.9K0
AI自动下载视频网站页面的视频
很多视频网站,可以在线免费看,但是无法下载。一般情况下,网站视频播放是采用了m3u8技术。M3U8是一种基于HTTP Live Streaming (HLS) 协议的播放列表格式,广泛应用于在线视频播放,特别是在直播和点播场景中。让AI写一个下载程序,就可以下载大部分在线视频网站的视频到本地电脑中了。
AIGC部落
2025/02/18
2200
AI自动下载视频网站页面的视频
【工具类】视频转换
调用的转换工具ffmpeg avi转mp4 Mp4VideoUtil.java
周杰伦本人
2022/10/25
1.3K0
如何下载完整的HLS流视频
需要从某网页下载一个视频文件,查看之后发现视频文件是用HLS视频流的,HLS全称Http Live Streaming,是由Apple公司定义的用于实时流传输的协议,HLS基于HTTP协议实现,传输内容包括两部分,一部分是m3u8描述文件,另一部分是ts媒体文件
李俊鹏
2020/11/12
8K0
Nginx零成本、易操作实现网站视频加速
最近有朋友做了个网站,网站上面放了几个视频,觉得视频播放慢、卡顿,想让我帮忙优化下,今天就介绍个零成本,操作又简单的方法优化网站上视频播放速度
李俊鹏
2021/02/23
3.9K0
Nginx零成本、易操作实现网站视频加速
批量爬取b站视频
码农GT038527
2024/11/17
2600
批量爬取b站视频
python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频「建议收藏」
一些网站会提供m3u8视频地址,以供下载观看。或者一些网站经过分析后发现是使用m3u8格式进行播放的,这时使用m3u8的地址链接就可以下载到相应的视频。
全栈程序员站长
2022/09/07
4.8K0
python爬取网站m3u8视频,将ts解密成mp4,合并成整体视频「建议收藏」
Python3 网络爬虫(四):视频下载,那些事儿!
「you-get」支持各大视频网站的视频下载,国内外加起来近 80 家。像国内的爱奇艺、腾讯视频、抖音、快手、B站、A站,国外的 Youtube、Twitter、TED、Instagram等等。
Jack_Cui
2020/05/18
6.7K0
Python3 网络爬虫(四):视频下载,那些事儿!
IVWEB玩转wasm系列-纯web视频剪辑/转换工具
在2013年(今年是2019年)的Node Knockout比赛上,有人提出了一个叫 Video Funhouse(年代太久远,我没能找到更多的资料)的设想,后来就有了github上的videoconverter方案。videoconverter将音视频领域中的瑞士军刀ffmpeg通过emscripten(一个可以将C/C++代码生成asm/wasm的编译工具)转化为javascript,实现了在浏览器上对视频的简单操作,包括视频的裁剪/转换。它的demo目前还能运行,地址如下:http://bgrins.github.io/videoconverter.js/demo
腾讯IVWEB团队
2020/06/27
3.1K0
IVWEB玩转wasm系列-纯web视频剪辑/转换工具
实战模拟│使用多进程教你下载 m3u8 加密或非加密视频「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161227.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/09
2K0
python合并ts视频
合并后视频出现卡顿、加速播放等问题,解决方法不知,如果有知道怎么解决的朋友,欢迎联系,不胜感激。
py3study
2020/01/08
3.3K0
相关推荐
百行代码轻松爬取视频
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验