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

        在一些视频网站中,通常使用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

祝大家成功!
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值