博客
关于我
Python | 02.下载视频(普通视频、m3u8加密视频ts)
阅读量:660 次
发布时间:2019-03-15

本文共 2323 字,大约阅读时间需要 7 分钟。

项目名称:getMovies

仅做技术分享使用,如侵必删

1. 获取下载链接

以某网站的视频为例(不同网站的规则不同,这是其中一种未加密的)

F12进入开发者模式,在Network中找到mp4文件(可以从Media中筛选)

在开发者工具中,点击F12,进入开发者模式。在Network选项卡中,点击Media标签,可以看到视频的下载链接。

Request URL对应的就是视频下载地址,也可以用下载器直接下载

在Network中的URL列,可以看到视频的下载链接。可以直接复制这个链接使用下载器下载视频。

2. 下载准备

2.1 获取请求头

必须要有完整的请求头信息,否则要么无法访问URL,要么视频无法正确解码。

在浏览器中,将下载链接复制到地址栏,手动刷新页面,获取完整的请求头信息。

可以使用自用的工具类源码,将请求头信息保存为字典类型:

import redef getHeaders(headersStr):    headers = {}    headersList = re.findall(r':?(.*?): (.*)\n?', headersStr)    for headersTuple in headersList:        headers[headersTuple[0]] = headersTuple[1]    return headers

2.2 获取文件名

文件名在下载链接中可以看到,使用正则表达式从URL中提取文件名。

例如,视频的下载链接为:https://example.com/video.mp4

可以使用以下正则表达式提取文件名:

import refile_url = "https://example.com/video_001.mp4"filename = re.findall(r'/(.*?\.mp4)', file_url)[0]print(filename)  # 输出:video_001.mp4

2.3 创建保存目录

保存路径对应的目录必须提前创建好。

可以使用以下命令创建文件夹:

# 创建单层文件夹os.mkdir("路径")# 创建包括父级文件夹在内的各级文件夹os.makedirs("路径")

3. 下载文件

一切准备就绪后,编写download()函数,参数包括:

  • url:视频下载链接
  • headers:请求头信息
  • full_file_name:完整文件名
  • download_path:文件保存路径
  • import urllib.requestimport osdef download(url, headers, full_file_name, download_path):    request = urllib.request.Request(url=url, method="GET", headers=headers)    try:        response = urllib.request.urlopen(request)        os.chdir(download_path)        file = open(full_file_name, "wb")        file.write(response.read())        file.close()        print(f"下载完成!{full_file_name}")    except urllib.error.HTTPError as e:        if e.code == 404:            print("该文件不存在!")        else:            print(e)

    4. 进阶练习:m3u8加密视频的下载

    有的网站上传的视频是经过m3u8加密处理过的。

    m3u8视频特点

  • 视频被切割成多个扩展名为.ts的小片段
  • 例如:xxxxxxxx000.ts, xxxxxxxx001.ts, xxxxxxxx002.ts
  • 获取ts文件列表

  • 使用开发者工具查看XHR或下载列表,找到所有ts文件
  • 观察URL规律,发现所有ts文件都以相同前缀 + 数字 + .ts 结尾
  • 下载并合并ts文件

    import osdef combineFiles(combinedFileName, downloadPath):    try:        os.remove(combinedFileName)    except FileNotFoundError:        pass    os.chdir(downloadPath)    allTsFileNames = os.listdir()    for tsFileName in allTsFileNames:        tsFile = open(tsFileName, "rb")        combinedFile = open(combinedFileName, "ab")        combinedFile.write(tsFile.read())        tsFile.close()        os.remove(tsFileName)    print("合并完成")    os.chdir(defaultPath)

    使用cmd合并文件

    copy /b D:\Python\*.ts D:\Python\combined.mp4

    最终,完成一个完整的视频下载工具链,实现从m3u8加密视频到本地合并后的视频文件。

    转载地址:http://ilbqz.baihongyu.com/

    你可能感兴趣的文章
    Vue Itea软件里直接npm run build 报错npm ERR! missing script :build
    查看>>
    勒索病毒Kraken2.0.7分析
    查看>>
    MySQL错误1366处理方法
    查看>>
    Error running Address localhost:1099 is already in use(已解决)
    查看>>
    pytorch深度学习中每个epoch运行时间的统计代码
    查看>>
    VxWorks 操作系统学习笔记
    查看>>
    链表插入和删除算法
    查看>>
    断言(assert)的用法
    查看>>
    主机与虚拟机(ubuntu)可以互ping,虚拟机不能上网解决办法
    查看>>
    驱动程序之_1_字符设备_13_USB设备_1_基本概念
    查看>>
    wxPython下载安装教程
    查看>>
    HERest源码解析
    查看>>
    java 原型模式(大话设计模式)
    查看>>
    微机原理 6-计算机中常用的数制
    查看>>
    web访问ejb测试 详解
    查看>>
    window系统下安装使用curl命令工具
    查看>>
    假如计算机是中国人发明的,那代码应该这么写
    查看>>
    神器 Codelf !
    查看>>
    趣图:会算法和不会算法的区别
    查看>>
    区块链会2020再次爆发,先学点DAPP压压惊,跟我一起学《区块链DApp入门实战》
    查看>>