利用python爬取m3u8格式视频的具体实现

 更新时间:2022年08月05日 08:57:30   作者:信息不对等  
之前爬取的视频都是mp4格式的,直接用requests请求就可以直接爬取,最近公司安排了一个小任务,需要爬取m3u8这种格式的视频,下面这篇文章主要给大家介绍了关于利用python爬取m3u8格式视频的相关资料,需要的朋友可以参考下

m3u8原理

当我们在网页播放视频时,网页向服务器发起一个以.m3u8结尾的连接请求,服务器会将具体的.ts文件链接路径发送给网页,网页接收这写链接路径,并向这些链接发送请求,请求到的资源就是.ts视频文件,他和我们常见的mp4文件只是封装格式的不同,而且.ts文件的大小很小,我爬取的.ts文件只有六秒的视频文件。之后网页将这些.ts文件整合在一起并进行播放。

脚本环境

python3.8、win 10

爬取步骤

python要做的事情

1、选择可以爬取的视频网站

2、获取.m3u8的URL路径

3、通过requests.get获取.ts文件路径

4、保存.ts文件

5、合并.ts文件为mp4格式

步骤的具体实现

1、视频网站:https://www.3s8m.com/

2、随便选择一个视频进入播放页面,按下F12或者Fn+F12,打开审查元素,选择网络,刷新页面,暂停视频,在审查元素的网络页面选择XHR(没有可以直接在全部搜索m3u8),找到以m3u8结尾的数据包,点击获取URL

3、python 编写代码请求该URL,打印返回的数据;代码如下

import requests
url = “用第二部找到的URL填入”
results = requests.get(url) #发送get请求
results.encoding=“utf8” #设置编码格式,从网页源码中的head中可以看编码格式,这步不关键
print(results.text) #打印结果
results.close() #关闭

4、可以发现第3步中打印结果有很多URL地址,这些地址就是ts文件的地址,python下载ts文件

import request
url =“填入获取到的ts文件的URL”
results = requests.get(url)
results.encoding =“utf8”
with open("./a.ts",“wb”) as file:
file.write(results.content)
results.close()

5、合并全部的ts文件,调用python的os库,使用系统命令(copy /b a.ts+b.ts a.mp4)进行合并

import os
os.system(“copy /b a.ts+b.ts a.mp4”)

python细节处理说明

1、上述是通过手动查找获取的m3u8地址,那么为什么不用python去爬取,如果用python去爬取那么就需要对爬取的内容进行分析检索,我使用正则进行检索,也可以用xpath、bs4等方式进行检索。

2、一个m3u8地址会对应多个ts文件地址,我们应该对同一个m3u8的ts地址进行整体保存,下载后进行整合在一起变为一个m3u8对应一个视频

3、我们在浏览上述提供的网站时会发现,有些资源有不通播放源,有些版源不能用,那么我们在进行检索的时候可以多加一个进行源切换的操作

4、至于保存的文件名、文件路径这些自己返回,具体的代码下面会提供一个参考。

参考代码

使用代码的前提条件及说明:

1、在代码文件的目录下建一个名为ts_path的文件夹用于保存爬取过程中的临时文件(.ts文件)

2、保存的视频会存放与代码文件同一目录线下,视频名称为 集数.mp4

3、视频下载完,ts_path中的文件需要手动删除,由于之前使用os.system进行删除,误删了我不少源码,决定不加删除代码防止意外

4、代码只是用与上述提供的网站,其他网站需要自己进行修改

import requests
import re
import os

URL = "输入URL" #视频URL
resources = 0   #播放源选择

episode_urls = [] #存放章节URL
episode_names = [] #存放章节名称
m3u8_urls = []  #存放ts文件的URL

def get_episode(URL,resources): #获取章节名和路径
    results = requests.get(URL)
    results.encoding = "utf-8"
    all = results.text
    results.close()
    episode = re.findall('<ul class="dslist-group">.*?</ul>', all, flags=re.S)
    b = re.finditer('href=".*?</a>', episode[resources],flags=re.S)
    for i in b:
        i = i[0].replace('href="', "").replace('"', "")
        episode_urls.append("https://www.3s8m.com" + i.split('>', 1)[0])
        episode_names.append(i.split('>', 1)[1].replace("</a>", ""))
    print(episode_names)
    print(episode_urls)


def get_ts(episode_urls): #获取ts文件路径
    for i in episode_urls:
        results = requests.get(i)
        results.encoding = "utf8"
        results = re.search('https:.*?\.m3u8', str(results.text),flags=re.S)
        m3u8_urls.append(results[0].replace("\\", ""))
    print(m3u8_urls)


def download_video(episode_names, m3u8_urls): #下载ts文件并整合为mp4文件
    for i in range(len(m3u8_urls)):
        try:
            print(m3u8_urls[i])
            results = requests.get(m3u8_urls[i])
            results.encoding = "utf8"
            all = re.finditer("https://.*?#", results.text, flags=re.S)
            results.close()
            cmd = []
            n = 0
            for j in all:
                n += 1
                ts_url = j[0].replace("\n#", "")
                cmd.append(f'{n}.ts')
                results = requests.get(ts_url,)
                results.encoding = "utf8"
                with open(f"./ts_path/{n}.ts", "wb") as file:
                    file.write(results.content)
                results.close()
                print(f"{n}.ts 下载完成")
            os.chdir("ts_path")
            if ("ts_path" in os.getcwd()):
                cmd = "+".join(cmd)
                cmd = f"copy /b {cmd} {episode_names[i]}.mp4"
                os.system(cmd)
                os.system(f"move {episode_names[i]}.mp4 ../")
            os.chdir("../")
            print(f"{episode_names[i]}.mp4 下载成功")
        except Exception as e:
            print(e)
            exit(0)

if __name__ == '__main__':
    get_episode(URL, resources)
    get_ts(episode_urls)
    download_video(episode_names, m3u8_urls)

脚本跟目录

总结 

到此这篇关于利用python爬取m3u8格式视频的文章就介绍到这了,更多相关python爬取m3u8格式视频内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python列表中多元素删除(移除)的实现

    Python列表中多元素删除(移除)的实现

    本文主要介绍了Python列表中多元素删除(移除)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 浅析python中numpy包中的argsort函数的使用

    浅析python中numpy包中的argsort函数的使用

    这篇文章主要介绍了python中numpy包中的argsort函数的使用,argsort()函数在模块numpy.core.fromnumeric中,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2018-08-08
  • 基于python实现把图片转换成素描

    基于python实现把图片转换成素描

    这篇文章主要介绍了基于python实现把图片转换成素描,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • 详解python while 函数及while和for的区别

    详解python while 函数及while和for的区别

    这篇文章主要介绍了python while 函数及while和for的区别 ,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-09-09
  • Python数据分析之双色球中蓝红球分析统计示例

    Python数据分析之双色球中蓝红球分析统计示例

    这篇文章主要介绍了Python数据分析之双色球中蓝红球分析统计,结合实例形式较为详细的分析了Python针对双色球蓝红球中奖数据分析的相关操作技巧,需要的朋友可以参考下
    2018-02-02
  • 如何利用python实现windows的批处理及文件夹操作

    如何利用python实现windows的批处理及文件夹操作

    最近工作中需要几个脚本运行其他程序,几乎像一个Windows批处理文件,这篇文章主要给大家介绍了关于如何利用python实现windows的批处理及文件夹操作的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • python实现获取当前设备的地点位置

    python实现获取当前设备的地点位置

    这篇文章主要介绍了python实现获取当前设备的地点位置,电脑如何获取当前所处的地理位置?它不会像我们一样对地理位置有感性的认知,它只认识数据,简言之,电脑可以通过获取当前连接的公网IP,反推所处的位置环境,需要的朋友可以参考一下
    2022-03-03
  • PyCharm如何设置Console控制台输出自动换行

    PyCharm如何设置Console控制台输出自动换行

    这篇文章主要介绍了PyCharm如何设置Console控制台输出自动换行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Python读取txt文件数据的方法(用于接口自动化参数化数据)

    Python读取txt文件数据的方法(用于接口自动化参数化数据)

    这篇文章主要介绍了Python读取txt文件数据的方法(用于接口自动化参数化数据),需要的朋友可以参考下
    2018-06-06
  • 通过实例了解Python str()和repr()的区别

    通过实例了解Python str()和repr()的区别

    这篇文章主要介绍了通过实例了解Python str()和repr()的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01

最新评论