python 下载m3u8视频「建议收藏」

python 下载m3u8视频「建议收藏」https://leetcode-cn.com/problems/course-schedule/solution/ke-cheng-biao-by-leetcode-solution/F12,打开开发者工具,清除会话记录,然后刷新网页下载该文件,内容如下:获取ts文件名称筛选出以“.ts”结尾的行有些情况下可能是以其他格式的文件,比如png,下载后修改后缀即可或者筛除以“#”开头的行…

大家好,又见面了,我是你们的朋友全栈君。

有一个朋友,通过一个网站(https://leetcode-cn.com/problems/course-schedule/solution/ke-cheng-biao-by-leetcode-solution/),看到一个视频,感觉不错,就想下载下来,可是下载不了,然后就求助与我,(此处省略一万字废话。。。)下面进入正题。

  • 网页界面如下图所示,红框中的即为将要下载的视频:

python 下载m3u8视频「建议收藏」

  • 按F12,打开开发者工具,清除会话记录,然后刷新网页

python 下载m3u8视频「建议收藏」

  • 下载该文件,文件内容如下:

python 下载m3u8视频「建议收藏」

代码如下:

import os
import requests

headers = {
    "accept": "*/*",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "zh-CN,zh;q=0.9",
    "cache-control": "no-cache",
    "origin": "https://leetcode-cn.com",
    "pragma": "no-cache",
    "referer": "https://leetcode-cn.com/problems/course-schedule/solution/ke-cheng-biao-by-leetcode-solution/",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-site",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
}


def get_m3u8_file(m3u8_url, file_path):
    """
    下载m3u8文件
    :param m3u8_url: m3u8文件的URL
    :param file_path: 要下载的文件位置
    :return:
    """
    resp = requests.get(m3u8_url, headers=headers)
    if resp.status_code == 200:
        content = resp.text
        with open(file_path, "w") as f:
            f.write(content)
  •  然后在输入框搜索“ts”,点击其中一个,发现ts文件请求URL除了最后两位数字不同(依次增加)以外,其他全部一致,而且和m3u8文件中的ts文件名称一致

python 下载m3u8视频「建议收藏」

  •  获取ts文件名称(筛选出以“.ts”结尾的行或者筛除以“#”开头的行

代码如下:

import os


def get_ts_name_list(file_path):
    """
    获取ts文件名称列表
    :param file_path: m3u8文件路径
    :return: ts文件名称列表
    """
    ts_name_list = []
    with open(file_path, "rb") as f:
        cont_list = f.readlines()
    for cont in cont_list:
        cont = cont.decode().strip()
        if cont.endswith(".ts"):
            ts_name_list.append(cont.split("/")[-1])
            # if not cont.startswith("#"):
            #     ts_name_list.append(cont.split("/")[-1])
    return ts_name_list

运行结果:

[‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00001.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00002.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00003.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00004.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00005.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00006.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00007.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00008.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00009.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00010.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00011.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00012.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00013.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00014.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00015.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00016.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00017.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00018.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00019.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00020.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00021.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00022.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00023.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00024.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00025.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00026.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00027.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00028.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00029.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00030.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00031.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00032.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00033.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00034.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00035.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00036.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00037.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00038.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00039.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00040.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00041.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00042.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00043.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00044.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00045.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00046.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00047.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00048.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00049.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00050.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00051.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00052.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00053.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00054.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00055.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00056.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00057.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00058.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00059.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00060.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00061.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00062.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00063.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00064.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00065.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00066.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00067.ts’, ‘c5c5c3d84d7b4c70bdef21cd7ef011e6-942a9205b7a3d6bdf7b63fbc60a35b45-hd-00068.ts’]

 

  • 下载ts文件

代码如下:

def get_ts_files(file_dir, ts_url_template, ts_name_list):
    """
    循环下载ts文件
    :param file_dir: 文件下载所在文件夹
    :param ts_url_template: ts文件请求URL模板
    :param ts_name_list: ts文件名称列表
    :return: 
    """
    for ts_name in ts_name_list:
        ts_url = ts_url_template + ts_name
        resp = requests.get(ts_url, headers=headers)
        if resp.status_code == 200:
            with open(os.path.join(file_dir, ts_name), "wb") as f:
                f.write(resp.content)
            print("%s-->下载成功!" % ts_name)
        else:
            print("%s-->下载失败!" % ts_name)

运行结果如下:

python 下载m3u8视频「建议收藏」

python 下载m3u8视频「建议收藏」

  • 将所有的ts文件合并成一个整体的ts文件

代码如下:

def merge_ts_files(file_dir, file_name, ts_name_list):
    """
    将多个ts文件进行合并
    :param file_dir: ts文件所在文件夹
    :param file_name: 合并后的文件名称
    :param ts_name_list: ts文件名称列表
    :return: 
    """
    file_out = os.path.join(file_dir, file_name)
    with open(file_out, 'wb') as f_out:
        for ts_name in ts_name_list:
            with open(os.path.join(file_dir, ts_name), "rb") as f_in:
                f_out.write(f_in.read())
    print("合并ts文件成功!")
  • 大功告成,看效果

python 下载m3u8视频「建议收藏」

python 下载m3u8视频「建议收藏」

最后附上全部代码(可直接运行):

import os
import requests

headers = {
    "accept": "*/*",
    "accept-encoding": "gzip, deflate, br",
    "accept-language": "zh-CN,zh;q=0.9",
    "cache-control": "no-cache",
    "origin": "https://leetcode-cn.com",
    "pragma": "no-cache",
    "referer": "https://leetcode-cn.com/problems/course-schedule/solution/ke-cheng-biao-by-leetcode-solution/",
    "sec-fetch-dest": "empty",
    "sec-fetch-mode": "cors",
    "sec-fetch-site": "same-site",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36",
}


def get_m3u8_file(m3u8_url, file_path):
    """
    下载m3u8文件
    :param m3u8_url: m3u8文件的URL
    :param file_path: 要下载的文件路径
    :return:
    """
    resp = requests.get(m3u8_url, headers=headers)
    if resp.status_code == 200:
        content = resp.text
        with open(file_path, "w") as f:
            f.write(content)


def get_ts_name_list(file_path):
    """
    获取ts文件名称列表
    :param file_path: m3u8文件路径
    :return: ts文件名称列表
    """
    ts_name_list = []
    with open(file_path, "rb") as f:
        cont_list = f.readlines()
    for cont in cont_list:
        cont = cont.decode().strip()
        if cont.endswith(".ts"):
            ts_name_list.append(cont.split("/")[-1])
            # if not cont.startswith("#"):
            #     ts_name_list.append(cont.split("/")[-1])
    return ts_name_list


def get_ts_files(file_dir, ts_url_template, ts_name_list):
    """
    循环下载ts文件
    :param file_dir: 文件下载所在文件夹
    :param ts_url_template: ts文件请求URL模板
    :param ts_name_list: ts文件名称列表
    :return:
    """
    for ts_name in ts_name_list:
        ts_url = ts_url_template + ts_name
        resp = requests.get(ts_url, headers=headers)
        if resp.status_code == 200:
            with open(os.path.join(file_dir, ts_name), "wb") as f:
                f.write(resp.content)
            print("%s-->下载成功!" % ts_name)
        else:
            print("%s-->下载失败!" % ts_name)


def merge_ts_files(file_dir, file_name, ts_name_list):
    """
    将多个ts文件进行合并
    :param file_dir: ts文件所在文件夹
    :param file_name: 合并后的文件名称
    :param ts_name_list: ts文件名称列表
    :return:
    """
    file_out = os.path.join(file_dir, file_name)
    with open(file_out, 'wb') as f_out:
        for ts_name in ts_name_list:
            with open(os.path.join(file_dir, ts_name), "rb") as f_in:
                f_out.write(f_in.read())
    print("合并ts文件成功!")


if __name__ == '__main__':
    # 用来保存ts文件
    file_dir = './ts_file'
    if not os.path.exists(file_dir):
        os.mkdir(file_dir)
    # m3u8文件URL
    m3u8_url = "https://video.leetcode-cn.com/5d1c2e6731b448aaa9965202c997a26c/c5c5c3d84d7b4c70bdef21cd7ef011e6-1380cfc54b15bf9d5088f6deaff5a053-hd.m3u8"
    # 提取文件名
    file_name = m3u8_url.split('/')[-1]
    file_path = os.path.join(file_dir, file_name)
    # 下载m3u8文件
    get_m3u8_file(m3u8_url, file_path)
    # 获取文件中ts文件名称列表
    ts_name_list = get_ts_name_list(file_path)
    # ts文件URL模板
    ts_url_template = "https://video.leetcode-cn.com/5d1c2e6731b448aaa9965202c997a26c/"
    # 下载ts文件
    get_ts_files(file_dir, ts_url_template, ts_name_list)
    # 合并ts文件
    ts_file_name = file_name.split(".")[0] + ".ts"
    merge_ts_files(file_dir, ts_file_name, ts_name_list)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151246.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月20日 下午9:00
下一篇 2022年6月20日 下午9:16


相关推荐

  • Linux下搭设游戏服务器实例大全

    Linux下搭设游戏服务器实例大全半条命hlds_l_3110_full.bin点击下载http://www.mudtx.com/download/hlds_l_3110_full.bincs1.5cs_15_full.tar.gz点击下载http://www.mudtx.com/download/cs_15_full.tar.gz免cdkey补丁engine_i386.so点击下载http://down.cs-cn….

    2022年7月14日
    15
  • IntelliJ IDEA添加注释常用的快捷键[通俗易懂]

    IntelliJ IDEA添加注释常用的快捷键[通俗易懂]IDEA可以使用快捷键添加行注释Ctrl+/、块注释Ctrl+Shift+/,还可以快速生成类注释、方法注释等,下面就介绍这几种快捷键的用法.[1]行注释Ctrl+/首先你的光标要处于这一行,处于这行的哪个位置都可以,按Ctrl+/,就可以往行首添加"//",将该行注释掉。再次按Ctrl+/,可以去掉该行注释。[2]块注释Ctrl+Shift+/使用块注释需要先选中要注释的…

    2022年8月15日
    8
  • 怎么在linux装samba服务器,在linux上装配置samba服务器.doc

    怎么在linux装samba服务器,在linux上装配置samba服务器.doc在linux上装配置samba服务器在linux上安装配置samba服务器在linux上安装配置samba服务器在这给大家介绍一个不错的家伙,samba服务。如果您正在犯愁,如何在Windows和Linux之间实现资源共享,就请看看这篇详解,希望能帮您解决困扰。先简单介绍一下,SMB(ServerMessagesBlock,信息服务块)是在局域网上共享文件和打印机的一种协议,通过它可以使局域网…

    2022年5月21日
    38
  • 允许跨域访问_vue浏览器清空跳转记录

    允许跨域访问_vue浏览器清空跳转记录from http://www.cnblogs.com/fengyuqing/p/javascript_xmlhttp.html在非IE下,使用XMLHttpRequest不能跨域访问,除非要访问的网页设置为允许跨域访问。将网页设置为允许跨域访问的方法如下: JavaResponse.AddHeader(“Access-Control

    2026年4月20日
    6
  • 嵌入式linux基础学习全套精品视频教程

    嵌入式linux基础学习全套精品视频教程嵌入式linux基础学习全套精品视频教程在给大家分享教程之前,首先给大家简要的介绍一下嵌入式linux,嵌入式linux是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。嵌入式linux既继承了Internet上无限的开放源代码资源,又具有嵌入式操作系统的特性。本教程是嵌入式linux基础学习全套精品视频教程,比较适合嵌入式初级学员们学习,需要

    2022年5月16日
    51
  • 支持二级汉字的 php 汉字助记码生成

    支持二级汉字的 php 汉字助记码生成gbk2312编码范围共94区,0-55区为一级汉字,是按照拼音顺序排列的,可以按照编码区间确定汉字的拼音,但是56区以后是按笔画顺序排列的,所以只能用对照表来确定拼音鉴于目前我找不到现成的代码,固整理了一份,测试可用./***PHP汉字转拼音*echoCUtf8_PY::encode(‘字符串’);//编码为拼音首字母*echoCUtf8_P…

    2022年6月21日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号