Selenium+Request爬取某鱼直播音频数据(下)

获取M3U8地址:

在上文已经获取到m3u8地址,
直接上代码

import requests
import os
#需要安装
from Crypto.Cipher import AES
import uuid


def m3u8(url):

    base_url = url[:url.rfind('/')+1]#如果需要拼接url,则启用 , +1 把 / 加上
    headers = {
    
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
    rs = requests.get(url,headers=headers).text
    list_content = rs.split('\n')
    player_list = []
    #如果没有merge文件夹则新建merge文件夹,用于存放ts文件
    if not os.path.exists('merge'):
        os.system('mkdir merge')
    key = ''
    for index,line in enumerate(list_content):
        # 判断视频是否经过AES-128加密
        if "#EXT-X-KEY" in line:
            method_pos = line.find("METHOD")
            comma_pos = line.find(",")
            method = line[method_pos:comma_pos].split('=')[1]#获取加密方式
            print("Decode Method:", method)
            uri_pos = line.find("URI")
            quotation_mark_pos = line.rfind('"')
            key_path = line[uri_pos:quotation_mark_pos].split('"')[1]
            key_url = key_path
            res = requests.get(key_url)
            key = res.content   #获取加密密钥
            print("key:", key)
        #以下拼接方式可能会根据自己的需求进行改动
        if '#EXTINF' in line:
            # href = ''
            # 如果加密,直接提取每一级的.ts文件链接地址
            if 'http' in list_content[index + 1]:
                href = list_content[index + 1]
                player_list.append(href)
            # 如果没有加密,构造出url链接
            elif('ad0.ts' not in list_content[index + 1]):
                href = base_url + list_content[index+1]
                player_list.append(href)
    if(len(key)):
        print('此视频经过加密')
        print(player_list)#打印ts地址列表
        for i,j in enumerate(player_list):
            cryptor = AES.new(key, AES.MODE_CBC, key)
            res = requests.get(j,headers=headers)
            with open('merge/' + str(i+1) + '.ts','wb') as file:
                file.write(cryptor.decrypt(res.content))#将解密后的视频写入文件
                print('正在写入第{}个文件'.format(i+1))
    else:
        print('此视频未加密')
        print(player_list)#打印ts地址列表
        #生成随机名
        ret =uuid.uuid1()
        path = os.getcwd() + '\merge'  # 获取视频存放路径
        #合成并.ts文件,自定义
        new_file = u"{}\{}.ts".format(path,ret)
        #合并成一个文件
        with open(new_file,'wb+') as file:
            for i,j in enumerate(player_list):
                res = requests.get(url=j, headers=headers)
                file.write(res.content)
                print('正在写入第{}个文件'.format(i + 1))

        print('下载完成')

if __name__ == '__main__':
#地址为上文获取的m3u8地址
    url ="https://apd-708650dfbd236a3bf3dd058958fa0147.v.smtcdns.com/sportsts.tc.qq.com/AY2Ug9CnIkEJD7lnyT5NTyKh33kOsMDch1jipcvMvjZ4/uwMROfz2r5zAoaQXGdGnC2df644E7D3uP8M8pmtgwsRK9nEL/a779mIeJvMkCYxLB2cTj1Q1MVoScAoewQwoeGxZgG02L9Mg0jDHnbT2nrvP9dQoSVhMCzrz4RzrvTBhIq0oWgGF6dBF13OmdUziwra6awnjrCfz93qCZ4x-24ZUnuG5ssRkl_SULo1ji4o8Z9473KEGTZSGhDF-Yi_eFu1GsNmg/f0034qpo5mh.321002.ts.m3u8?ver=4"
    # 下载视频
    m3u8(url)

猜你喜欢

转载自blog.csdn.net/qq_35944102/article/details/108385544
今日推荐