怎么下载m3u8格式视频?Python爬取A站m3u8格式视频案例讲解

怎么下载m3u8格式视频?Python爬取A站m3u8格式视频案例讲解

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理

本篇文章流程

一. 数据来源分析

  1. 确定需求 (确定要爬的内容是什么?)。只有知道数据要的是什么,才能根据实际情况去分析 它的来源

  2. 怎么去分析 (开发者工具[浏览器都自带 鼠标右键点击插件或者F12]) 抓包分析
    所有的ts文件内容 来自 m3u8

有不懂的问题、报错解答,想要源码、视频教程,数据集的同学也可以点这里

二. 代码实现步骤

  1. 发送请求 对于视频的详情页url地址发送请求
  2. 获取数据 获取视频的详情页网页源代码
  3. 解析数据 提取 m3u8的 url地址 标题
  4. 发送请求 对于m3u8的 url地址 发送请求
  5. 获取数据 获取所有ts url地址(不是完整是需要拼接)
  6. 发送请求 对于 ts url地址 发送请求
  7. 保存数据 保存ts 视频片段 一个一个视频片段
  8. 合成视频 一个整体视频内容

代码

导入所需的模块

import requests # 数据请求模块 pip install requestsimport re # 正则表达式 内置模块 不需要安装import os # 文件操作import zipfile #压缩文件

用python代码,对于服务器发送请求,服务器接收到请求之后(确定不是爬虫代码,你是正常客户端),才会给你返回数据

url = f'https://www.acfun.cn/v/ac23857874headers = {    'User-Agent': ' Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36'}response = requests.get(url=url, headers=headers)print(response)

运行代码,返回值为200

解析数据 提取m3u8 url地址 标题

元字符 * +

.*? 通配符 可以匹配任意字符(除了\n) 匹配文字 匹配数字 字母 特殊字符 re.S

\ 转义字符 把含有特殊含义的字符转成除了字符本身以外 没有其他意思

[0] 正则表达式提取出来的内容 返回是列表 [0] 0 是指列表索引位置 索引位置是0 是列表里面的第一个元素

[0,1,2,3,4,5] img\ 我转义我自己

() 表示精确匹配 ? 非贪婪匹配

title = re.findall('<title >(.*?) - AcFun弹幕视频网 - 认真你就输啦 \(\?ω\?\)ノ- \( ゜- ゜\)つロ</title>', response.text)[0]m3u8_url = re.findall('"backupUrl(.*?)\"]', response.text)[0].replace('\"', '').split('\')[2]m3u8_data = requests.get(url=m3u8_url, headers=headers).textprint(m3u8_url)

正则解析

正则表达式替换 re.sub() join 是把列表转成字符串

\d 匹配数字 \d+匹配多个数字 * 匹配前一个字符0个或者多个无数个

m3u8_data = re.sub('#EXTM3U', '', m3u8_data)m3u8_data = re.sub('#EXT-X-VERSION:\d', '', m3u8_data)m3u8_data = re.sub('#EXT-X-TARGETDURATION:\d', '', m3u8_data)m3u8_data = re.sub('#EXT-X-MEDIA-SEQUENCE:\d', '', m3u8_data)m3u8_data = re.sub('#EXTINF:\d\.\d+,', '', m3u8_data)m3u8_data = re.sub('#EXT-X-ENDLIST', '', m3u8_data)m3u8_data = m3u8_data.split()for link in m3u8_data:    # 字符串拼接 加上 才是完整url地址 构建完整的url地址    link_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/hls/' + link  

保存文件 你确定文件保存路径 保存文件的名字 后缀

link_content = requests.get(url=link_url, headers=headers).contentlink_name = link.split('.')[1]with open(filename + link_name + '.ts', mode='w') as f:    f.write(link_content)

合并视频

files = os.listdir(filename)print('开始视频片段合成..................')with zipfile.ZipFile(filename + title + '.mp4', mode='w') as z:    for file in tqdm(files):        path_file = filename + file        z.write(path_file)        os.remove(path_file)print('视频片段合成完毕..................')


免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部