在一些视频网站中,通常使用m3u8文件来作为视频播放列表,我们下载视频网站m3u8文件后分析,会发现m3u8文件中都是*.ts的视频地址链接,此时可以读取m3u8文件后,使用列表推导式将所有的ts结尾的字符串读取出来,生成一个列表urllist,然后可以使用requests.get(url)下载ts文件,最后在对应的文件夹中执行copy /b *.ts movie.mp4,就可以将下载一部完整的电源了。但是在实际操作中,我们会发现urllist列表中有一些是广告视频,通常是以 "https://ad."开头,所以我们需要将这些广告视频的url给过滤掉。废话不多说,下面以chrome浏览器为例,具体操作如下:

1、获取m3u8文件,打开浏览器的调试功能(快捷键F12),选择network->xhr,再刷新一下页面,得到如下信息

双击图中蓝色部分的m3u8文件,即可下载

2、解析m3u8文件,使用文本文档打开该文件后,通过分析会发现,广告文件的ts地址与其它视频文件的ts地址不同,红框中的内容就是广告文件。

如果使用下面列表推导式方法获取ts文件列表,就会把广告文件的ts文件列表一起添加到urls中,这是我们不想要的文件。

urls = [u.strip() for u in lines if u.strip().endswith('.ts')]

仔细分析,广告的url地址都是以"https://ad."开头,我们可以通过以下方法快速过滤

urls = [u.strip() for u in lines if u.strip().endswith('.ts') and 'https://ad.' not in u.strip()]

如果广告的url地址不是这种字符串开头的话,就需要将广告的域名单独存放在一个txt文件中,每个广告域名占一行,读取方法如下:

with open('advertDomain.txt', 'r', encoding='utf-8') as ad:advertDomain = [a.strip() for a in ad.readlines()]

前面都是用列表推导式获取的ts列表,这时我同样还想用列表推导式,此时发现这个问题是两个列表的问题了,有点棘手,通过查阅了很多资料,终于找到了解决方法,代码如下:

# 1、使用2次循环过滤掉广告列表
urls = [u.strip() for u in lines if u.strip().endswith('.ts')]
for a in range(len(urls) - 1, -1, -1):for ad in advertDomain:if ad in urls[a]:del urls[a]break# 2、直接使用列表推导式完成
urls = [u.strip() for u in lines if u.strip().endswith('.ts') and not any(ad in u.strip() for ad in advertDomain)]

一行代码解决问题的方式是不是很爽。

3、下载urls列表中的文件,需要导入第三方库requests,在cmd命令窗口中运行pip install requests,使用reqeusts.get(url)进行下载。下载时要注意按照urls列表中的次序下载,下载后的文件最好用0000001.ts这种格式的文件名来保存,方便后续合并,千万不要用纯数字的文件名来命名,例如:1.ts、2.ts,这样命名的文件在排序时11.ts会排在2.ts前面,导致视频次序错误。

import requests
i = 1
header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0'}
for url in urls:response = requests.get(url, headers=header, timeout=10)with open(f'{i:010}' + '.ts','wb') as tsfile:tsfile.write(response.content)i=i+1

代码中以10个长度的文件名来命名,不足位用“0”表示,timeout这个参数一定要加上,不然会出现卡死的现象

4、合并ts文件为mp4,打开windows命令提示符窗口,在命令提示符中使用cd命令进入到ts文件所在的目录,然后运行以下命令:

copy /b *.ts movie.mp4

在该目录中就能生成mp4文件了。

5、有一些视频是加密过的,需要使用网站上提供的key.key文件进行解密,在图1中可以看到有一个key.key文件,双击下载,key.key文件中就是一段解密的文本,需要引入第三方库Crypto来解密,将key.key文件中的文本读取出来,使用如下方法下载并解密:

from Crypto.Cipher import AES
def download_decodemovie(key, url):# 根据密钥key解码cryptor = AES.new(key.encode('utf-8'), AES.MODE_CBC)header = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0'}response = requests.get(url, headers=header, timeout=10)decodets = cryptor.decrypt(response.content)return decodets

祝大家成功!

python列表推导式去除m3u8中的广告视频地址下载视频相关推荐

  1. python列表推导式中使用if语句及他们的等价形式

    python列表推导式中使用if语句及他们的等价形式 在python的列表推导式中使用if语句有两种形式: # 方式1: 起过滤作用 [expr(x) for x in li if cond(x)] ...

  2. Python 列表推导式 - Python零基础入门教程

    目录 一.Python 列表推导式简介 二.Python 列表推导式语法 三.Python 列表推导式练习 1.Python 列表推导式案例一 2.Python 列表推导式案例二 3.Python 列 ...

  3. python 列表推导式csv_Python 列表推导式

    在本教程中,我们将学习使用 Python 列表推导. Python 列表推导式 列表推导式是一种基于现有列表创建列表的语法结构. 列表推导式为创建列表提供了一种简洁的方法. 常见的要求是创建新列表,其 ...

  4. 【技能树共建】Python 列表推导式

    Python 列表推导式是什么 列表推导式是 Python 语言特有的一种语法结构,也可以看成是 Python 中一种独特的数据处理方式, 它在 Python 中用于 转换 和 过滤 数据. 其语法格 ...

  5. python列表推导式是什么

    列表推导式(又称列表解析式)提供了一种简明扼要的方法来创建列表. 它的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是 0 个或多个 for 或者 if 语句.那个表达式可以是任意的, ...

  6. 百钱买百鸡python列表推导式_课时60 数据类型详解-列表-练习题

    练习题 1.使用列表推导式把字典中的键值对转换成key=value的数据格式 ''' 字典{'user':'admin','age':20,'phone':'133'} 列表{'user=admin' ...

  7. python列表推导式中使用if和if-else

    在python中,使用列表推导式来完成一些程序逻辑会让程序更为简洁. 本文将用案例的形式教会你如何在列表推导式中使用if...else 目录 1.语法结构 2.实例演示 1.语法结构 列表推导式总共以 ...

  8. python 列表推导 为什么快_Python中简单的列表推导式,却能解决复杂的问题,你学会了吗?...

    Beautiful is better than ugly. ------Python之禅 01[引子] 我们知道,Python是一门简单.易学的编程语言,"Python之禅"里面 ...

  9. python列表推导式中使用if-else

    列表推导式总共有两种形式: ①[x for x in data if condition] 此处if主要起条件判断作用,data数据中只有满足if条件的才会被留下,最后统一生成为一个数据列表 ②[ex ...

最新文章

  1. 图像与数据类型的对应,以及如何显示
  2. J2ME程序开发新手入门九大要点
  3. tomca7.0 mysql配置连接池_tomcat7.0+mysql连接池配置
  4. 系统中多种隐藏超级用户添加方法第1/2页
  5. vivox3android系统,vivo X3手机系统是什么 vivo X3手机能升级安卓4.3
  6. 如何选择最优路径完成云原生上云?听这场阿里云特别分享【云原生技术与最佳实践】
  7. 4列变成5列 datatable_云南美食界“5巨头”,谁才是NO.1?你家乡的那道菜也在列...
  8. 喜马拉雅三年亏损超20亿 腾讯、小米为股东
  9. mysql show db_mysql show操作
  10. 美国AI出口限令倒计时,硅谷直喊“下手轻点”,担心推动中国技术发展
  11. jira api java,如何使用其余api(java)在jira中创建问题?
  12. Android Spinner 设置setOnItemSelectedListener时,竟会默认触发一次事件!
  13. [翻译]架构师应该知道的97件事_03关键问题可能不是出在技术上
  14. vue中index.html文件为什么可以使用模板语法
  15. Unity-TouchScripts中使用TUIO的记录和简单的代码分析
  16. 最新码支付源码+全套的程序+三网监控+易支付H5接口 2022年6月22号
  17. Vue+Element 表格打印
  18. 【JZOJ4587】Snow的追寻
  19. 关于Mariadb数据库 配置
  20. 前端小白仿写小米官网首页(静态页面+jquery轮播图)

热门文章

  1. Lazada和Shopee选品分析之马来西亚电商市场详解-海鲸跨境
  2. Html网页远程控制电脑,如何从Web浏览器远程控制您的计算机 | MOS86
  3. 粉丝测试题的软件,套路得粉丝的答题类H5推荐
  4. js动态修改浏览器title标题
  5. scrapy爬虫实例:凤凰网
  6. 中国剩余定理的算法实现(基于c语言miracl库)
  7. 【GameMaker】协程——异步执行代码
  8. Linux系统SCSI磁盘扫描机制解析及命令实例
  9. python 当前日期的上一个月和后一个月
  10. MySQL 存储引擎 (SphinxSE)安装详解