2025年3月27日 星期四 甲辰(龙)年 月廿六 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Python

Python 手把手实现M3U8视频抓取

时间:04-23来源:作者:点击数:88

目标(科)上(学)网 : https://www.pinterest.co.uk/pin/350788258477414986/


一. m3u8介绍

1.1 什么是m3u8?

  • 官方解释

    M3U8是 Unicode 版本的M3U,用 UTF-8 编码。"M3U" 和 "M3U8" 文件都是苹果公司使用的HTTP Live Streaming(HLS)协议格式的基础,这种协议格式可以在 iPhone 和 Macbook 等设备播放。

  • 通俗点可以理解为,一个视频文件拆分为多个.ts片段的视频文件,然后将所有的ts合成MP4文件就可以播放了。但是为什么有些在线或者m3u8的播放器会用不了呢?由于大部门的m3u8生成的结果不太一致,与该播放器的解密格式不一样,所以导致打开

1.2 m3u8如何打开?

  • 用专门的m3u8播放器或浏览器插件
  • 用winrar压缩软件合成
    【前置条件】
    • 已下载所有ts的视频文件,通过全选压缩合成mp4文件【比较卡,不顺畅,不建议】
    • 全选
    • 合成(出来的效果不尽人意)
  • 那么最理想的是什么?
    • 把下载后的视频用字节流的方式合成一个完整的mp4文件

1.3 如何拼接.ts文件

二 . m3u8加密方案

  • 市面上常见的加密方案是把m3u8的响应结果用AES、DES加密,混淆大家的视线,提高数据的安全度、可靠度。

三 . m3u8转mp4流程


  1. 抓包找到对应的m3u8文件
  2. 请求获取相应后的m3u8文件
  3. 处理对应的ts链接,并下载
  4. 将下载后的ts文件以字节流方式合成MP4文件

  • 思路图

3.1 抓包找到对应的m3u8文件

  • 对头了文件都在里面

3.2 请求获取相应后的m3u8文件

3.3 处理对应的ts链接,并下载

  • xxx.ts 替换 xxx.m3u8后缀
  • 下载文件
  • 对头出货了

3.4 将下载后的ts文件以字节流方式合成MP4文件

  • 成败在此一举了

四、完整上码

  • 即拿即用(需要注意【科】上【学】网)
  • import re
  • import requests, os
  • project_path = os.path.abspath(os.path.dirname(__file__))
  • video_path = os.path.abspath(os.path.join(os.path.dirname(__file__), 'video'))
  • class VideoSynthesis:
  •     def __init__(self):
  •         self.header = {
  •             'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'
  •         }
  •         self.m3u8_link = 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w.m3u8'
  •         self.base_url = 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/'
  •     def get_m3u8_link(self):
  •         # 下载m3u8视频
  •         m3u8_response = requests.get(url=self.m3u8_link, headers=self.header, verify=False)
  •         print(m3u8_response.text)
  •         return m3u8_response
  •     def handle_m3u8_response(self, m3u8_response):
  •         # 处理m3u8响应
  •         ts_filename = re.findall('.*?EXTINF:.*?,\n(.*?)\n', m3u8_response.replace(' ''').replace(r'\n'''))
  •         print(f'tslist: {ts_filename}')
  •         ts_link_list = []
  •         for item in ts_filename:
  •             result_url = self.base_url + item
  •             ts_link_list.append(result_url)
  •         print(f'ts_link_list: {ts_link_list}')
  •         return ts_link_list, ts_filename
  •     def download_ts_video(self, ts_url_list, ts_filename):
  •         # 通过ts链接下载ts文件
  •         for i in range(len(ts_url_list)):
  •             ts_url = ts_url_list[i]
  •             ts_name = ts_filename[i]
  •             try:
  •                 response = requests.get(ts_url, stream=True, verify=False)
  •             except Exception as e:
  •                 print("异常请求:%s" % e.args)
  •                 return
  •             # 在当前目录下创建个video文件夹
  •             ts_path = project_path + r"\video\{}".format(ts_name)
  •             with open(ts_path, "wb+"as file:
  •                 for chunk in response.iter_content(chunk_size=1024):
  •                     if chunk:
  •                         file.write(chunk)
  •         print("TS文件下载完毕!!")
  •     def heBingTsVideo(self):
  •         # 视频合成
  •         hebing_path = video_path + r"\m3u8_video.mp4"
  •         print(hebing_path)
  •         all_ts = os.listdir(video_path)
  •         with open(hebing_path, 'wb+'as f:
  •             for i in range(len(all_ts)):
  •                 ts_video_path = os.path.join(video_path, all_ts[i])
  •                 f.write(open(ts_video_path, 'rb').read())
  •         print("合并完成!!")
  •     def run(self):
  •         m3u8_response = self.get_m3u8_link()
  •         ts_link_list, ts_filename = self.handle_m3u8_response(m3u8_response)
  •         
  •         # ts_link_list = ['https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w00000.ts', 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w00001.ts', 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w00002.ts', 'https://v.pinimg.com/videos/v2/hls/49/3e/6b/493e6bb3f832caf2bef872d648698ff4_hls480w00003.ts']
  •         # ts_filename = ['493e6bb3f832caf2bef872d648698ff4_hls480w00000.ts', '493e6bb3f832caf2bef872d648698ff4_hls480w00001.ts' ,'493e6bb3f832caf2bef872d648698ff4_hls480w00002.ts', '493e6bb3f832caf2bef872d648698ff4_hls480w00003.ts']
  •         
  •         self.download_ts_video(ts_link_list, ts_filename)
  •         self.heBingTsVideo()
  • if __name__ == '__main__':
  •     video_synthesis = VideoSynthesis()
  •     video_synthesis.run()
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门