python实战案例——爬取A站视频,m3u8格式视频抓取(内含完整代码!)

1、任务目标

目标网站:A站视频(https://www.acfun.cn/v/ac40795151)
要求:抓取该网址下的视频,将其存入本地,视频如下:

在这里插入图片描述

2、网页分析

  1. 进入目标网站,打开开发者模式,我们发现视频播放过程中有一个特点,也就是在Network-Fetch/XHR下不断有一些相似的接口文件产生
    在这里插入图片描述
  2. 我们点击其中一个接口文件,发现 preview 下的内容都是类似乱码的数据,其实在网页中发现这种数据的文件,基本上都是二进制码流文件,其中存放的就是视频、音频、图片等数据,这里我们可以确定他就是我们要找的视频文件,在观察其URL发现它是一个ts文件,且以序号结尾,如:100000.ts ;我们多观察几个这种ts文件,发现都是按顺序排列的。我们称这种格式的视频文件为m3u8格式
    在这里插入图片描述


m3u8格式视频简单介绍:

m3u8 格式其实就是将一个长的视频切割成一个个小的视频片段,然后网站通过不断加载这些片段,从而播放视频,这些片段自然就是上面说的 .ts格式的文件,并且这些片段还会进行编号,如:1000.ts,1001.ts,1002.ts;m3u8格式视频的好处就是,当我们滑动视频进度条,网站会直接加载该时间段的ts文件,一般一个片段就几秒钟,这样就可以快速定位并播放此刻的视频内容,从而给用户很好的观看体验

  1. 从上面我们知道了视频内容就存放在这些ts文件片段中,我们需要将其下载下来合并到一个mp4 文件中,从而播放完整的视频,一般一个ts片段几秒钟,这个视频只有1分多钟,那么至少有20来个ts文件需要找到,那么如何寻找这些文件呢?若等视频慢慢播放加载,不太现实。但是该网站有个特点,他会将所有ts文件的地址存放至一个 m3u8格式的文件中,该文件我们同样可以在 Network-Fetch/XHR 下找到,可以看到在下面这个m3u8格式的文件中,存放着这所有ts文件的url地址,这些地址都缺少主域名,后续我们需要将其拼接为完整地址
    在这里插入图片描述
  2. 现在找到了存放ts文件地址的m3u8 格式文件了,那么m3u8格式文件的地址又在哪里呢?我们发现在 Network-Doc 有一个文件,其中存放的内容就包含了m3u8文件的地址
    在这里插入图片描述
  3. 我们在内容中搜索m3u8,可以发现许多相关的链接地址,这些地址代表着不同编码、不同清晰度的m3u8文件的地址,我们只需选择其中一个就行,下面我将选择 720p清晰度的地址
    在这里插入图片描述


总结:
在上面我们经过分析网页,对该网站的爬取有了一定的思路,大致步骤如下:

  1. 向存放m3u8文件地址的接口文件发起请求,从中分析出想要的m3u8文件链接
  2. m3u8文件发起请求,从中解析出所有的ts文件地址
  3. 向每个ts文件发起请求,将他们依次存入到mp4文件中,最后合并为一个完整的视频文件

3、代码编写


完整代码:

'''
目标网站:https://www.acfun.cn/v/ac40795151
要求:爬取该网站下的视频,将其存放至本地
'''
import requests
import re
import json
from jsonpath import jsonpath
from bs4 import BeautifulSoup
from tqdm import tqdm # 用于显示进度条,需要下载:pip install tqdm# 1、准备网站信息
# 目标网站
url = 'https://www.acfun.cn/v/ac40795151'
# 身份信息
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.43',
}# 2、获取m3u8文件链接
def get_m3u8():re_html = requests.get(url,headers=headers).text # 获得视频页面的网页源码# 用正则解析出目标内容str_data = re.findall('<script>.*?window.pageInfo\s=\swindow.videoInfo\s=\s(.*?);.*?window.videoResource\s=\s{}',re_html,re.S)[0]# 将字符串数据转换为json格式数据json_data1 = json.loads(str_data)['currentVideoInfo']['ksPlayJson']json_data2 = json.loads(json_data1)# 得到m3u8文件的链接link_m3u8 = jsonpath(json_data2,'$..representation..url')[2]# 解析出视频标题soup = BeautifulSoup(re_html,'lxml')title = soup.select('.video-description.clearfix h1.title span')[0].string # 标题return link_m3u8,title# 2、获取所有的ts文件链接
def get_ts(link_m3u8):re_data = requests.get(link_m3u8,headers=headers).text # 得到m3u8文件的内容# 解析出所有的ts文件链接ts_link = re.sub('#.*', '', re_data).split()return ts_link# 3、合并所有ts文件
def combine(ts_link,title):print('下载进度:')# 遍历每个ts文件链接,并下载下来for l in tqdm(ts_link): # tadm 可以显示进度条ts_url = 'https://tx-safety-video.acfun.cn/mediacloud/acfun/acfun_video/' + l # 拼接为完整的链接ts_b = requests.get(ts_url,headers=headers).content # 得到下载的ts文件二进制流# 将ts文件全部保存至一个MP4文件中,完成合并!with open(f'{title}.mp4','ab') as f:f.write(ts_b)print('下载完成!')f.close()# 4、调用函数
def start():# 依次调用每个函数link_m3u8,title = get_m3u8()ts_link = get_ts(link_m3u8)combine(ts_link,title)if __name__ == '__main__':# 启动程序start()

执行效果:
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/467948.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【基于轻量型架构的WEB开发】课程 12.4 页面跳转 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

12.4 页面跳转 12.4.1 返回值为void类型的页面跳转 返回值为void类型的页面跳转到默认页面 当Spring MVC方法的返回值为void类型&#xff0c;方法执行后会跳转到默认的页面。默认页面的路径由方法映射路径和视图解析器中的前缀、后缀拼接成&#xff0c;拼接格式为“前缀方法…

濮良贵《机械设计》第十版课后习题答案全解PDF电子版

《机械设计》(第十版)是“十二五”普通高等教育本科国家级规划教材&#xff0c; 是在《机械设计》(第九版)的基础上修订而成的。本次修订主要做了以下几项工作&#xff1a; 1. 内容的适当更新——自本书第九版出版以来&#xff0c; 机械工程及相关领域的新理论、新技术和新标准…

【Unity基础】Unity中如何导入字体?

在Unity中&#xff0c;不能像其他软件一样直接使用字体文件&#xff0c;需要通过FontAssetCreator将其转换成Texture的Asset文件&#xff0c;然后才能使用。 本文介绍了使用FontAssetCreator导入字体的过程&#xff0c;并对其参数设置进行了说明。 Font Asset Creator 是 Uni…

2024年11月8日上海帆软用户大会

2024年11月8日上海帆软用户大会 2024年11月8日&#xff0c;上海成功举办了帆软用户大会&#xff0c;主题为“数字聚力&#xff0c;绽放新机”。大会汇聚了众多行业专家和企业代表&#xff0c;共同探讨数字化转型和商业智能领域的最新趋势和实践。 大会亮点&#xff1a; 专家…

注意力机制的目的:理解语义;编码器嵌入高纬空间计算;注意力得分“得到S*V”;解码器掩码和交叉注意力层用于训练;最终的编码器和输出实现大模型

目录 注意力机制的目的:理解语义中的它是小白兔 词编码器嵌入高纬空间 计算注意力得分“得到S*V” 权重QKV:连接权重 训练阶段使用解码器:翻译后的语句 解码器掩码和交叉注意力层用于训练 最终的编码器和输出实现大模型 Transformer模型中,QKV QKV的作用 举例说明…

纯前端实现在线预览excel文件(插件: LuckyExcel、Luckysheet)

概述 在实际开发中&#xff0c;遇到需要在线预览各种文件的需求&#xff0c;最近遇到在线预览excel文件的需求&#xff0c;在此记录一下&#xff01;本文主要功能实现&#xff0c;用于插件 LuckyExcel &#xff0c;Luckysheet&#xff01;废话不多说&#xff0c;上代码&#xf…

WPF自定义翻页控件

XAML文件如下&#xff1a; <UserControlx:Class"CTMVVMDemo.View.UserControls.DataPager"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://s…

Linux中.NET读取excel组件,不会出现The type initializer for ‘Gdip‘ threw an exception异常

组件&#xff0c;可通过nuget安装&#xff0c;直接搜名字&#xff1a; ExcelDataReader using ConsoleAppReadFileData.Model; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类&#xff0c;专门用于让用户选择颜色。它提供了一个标准的颜色选择界面&#xff0c;其中包括基本的颜色选择器&#xff08;如调色板和颜色轮&#xff09;、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…

使用Python实现音频降噪

在音频处理领域&#xff0c;背景噪声是一个常见的问题。为了提高音频的质量&#xff0c;我们需要对音频进行降噪处理。本文将介绍如何使用 Python 实现音频降噪。 依赖库安装 在开始之前&#xff0c;我们需要安装以下依赖库&#xff1a; pydub&#xff1a;用于音频文件的读取…

【WRF模拟】全过程总结:WPS预处理及WRF运行

【WRF模拟】全过程总结:WPS预处理及WRF运行 1 数据准备1.1 嵌套域设置(Customize domain)-基于QGis中gis4wrf插件1.2 静态地理数据1.2.1 叶面积指数LAI和植被覆盖度Fpar(月尺度)1.2.2 地面反照率(月尺度)1.2.3 土地利用类型+不透水面积1.2.4 数据处理:geotiff→tiff(W…

【react】Redux基础用法

1. Redux基础用法 Redux 是一个用于 JavaScript 应用的状态管理库&#xff0c;它不依赖于任何 UI库&#xff0c;但常用于与 React 框架配合使用。它提供了一种集中式的状态管理方式&#xff0c;将应用的所有状态保存在一个单一的全局 Store&#xff08;存储&#xff09;中&…

DevCheck Pro手机硬件检测工具v5.33

前言 DevCheck Pro是一款手机硬件和操作系统信息检测查看工具&#xff0c;该软件的功能非常强大&#xff0c;为用户提供了系统、硬件、应用程序、相机、网络、电池等一系列信息查看功能 安装环境 [名称]&#xff1a;DevCheckPro [版本]&#xff1a;5.33 [大小]&a…

Docker的轻量级可视化工具Portainer

docker目录 1 Portainer官方链接2 是什么&#xff1f;3 下载安装4 跑通一次5 后记 1 Portainer官方链接 这里给出portainer的官方链接&#xff1a;https://www.portainer.io/ portainer安装的官方链接&#xff1a;https://docs.portainer.io/start/install-ce/server/docker/l…

IoTDB 与 HBase 对比详解:架构、功能与性能

五大方向&#xff0c;洞悉 IoTDB 与 HBase 的详尽对比&#xff01; 在物联网&#xff08;IoT&#xff09;领域&#xff0c;数据的采集、存储和分析是确保系统高效运行和决策准确的重要环节。随着物联网设备数量的增加和数据量的爆炸式增长&#xff0c;开发者和决策者们需要选择…

【c++丨STL】vector模拟实现

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C、STL 目录 前言 一、vector底层刨析 二、模拟实现 1. 属性、迭代器以及函数声明 2. 功能实现 交换两个容器的内容 构造函数 拷贝构造 赋值重载 析构…

C++中类的默认成员函数

默认成员函数 1.构造函数2.析构函数3.拷贝构造函数4.赋值运算符重载4.1运算符重载4.2赋值运算符重载 #mermaid-svg-oipiwg9stvONvYK0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-oipiwg9stvONvYK0 .error-icon{f…

数据编排与ETL有什么关系?

数据编排作为近期比较有热度的一个话题&#xff0c;讨论度比较高&#xff0c;同时数据编排的出现也暗示着数字化进程的自动化发展。在谈及数据编排时&#xff0c;通常也会谈到ETL&#xff0c;这两个东西有相似点也有不同点。 数据编排和ETL&#xff08;提取、转换、加载&#x…

【SpringCloud】SpringBoot集成Swagger 常用Swagger注解

概述&#xff1a;SpringBoot集成Swagger 常用Swagger注解 导语 相信无论是前端还是后端开发&#xff0c;都或多或少地被接口文档折磨过。前端经常抱怨后端给的接口文档与实际情况不一致。后端又觉得编写及维护接口文档会耗费不少精力&#xff0c;经常来不及更新。其实无论是前…

革命性AI搜索引擎!ChatGPT最新功能发布,无广告更智能!

文章目录 零、前言一、ChatGPT最新AI搜索引擎功能操作指导实战1:搜索新闻实战2:搜索天气实战3:搜索体育消息 二、感受 零、前言 大人&#xff0c;时代变了。 最强 AI 助力下的无广告搜索引擎终于问世。我们期待已久的这一刻终于到来了&#xff0c;从今天起&#xff0c;ChatGPT…