使用爬虫爬取热门电影
文章目录
- 网站存储视频的原理
- M3U8文件解读
- 网站分析
- 代码实现
网站存储视频的原理
首先我们来了解一下网站存储视频的原理。
一般情况下,一个网页里想要显示出一个视频资源,必须有一个<video>标签,
<video src="xxx.mp4"></video>
这个video标签里面的src并不是视频的真正下载地址,几乎没有视频网站会在video里直接给出下载地址。
因为这种方案使得用户体验极差,既占网速又占内存。
更好的方案是对视频进行切片(ts),切完了以后每个切片都有一个独立的url,当我们把所有的切片都获取到以后,再把切片文件的正确顺序进行保存,然后合并就可以得到一个完整的视频。
既然要把视频切成非常多个小碎片. 那就需要有个文件来记录这些小碎片的路径. 该文件一般为M3U文件. M3U文件中的内容经过UTF-8的编码后, 就是M3U8文件. 今天, 我们看到的各大视频网站平台使用的几乎都是M3U8文件.
现在的视频网站用的几乎都是这种方案。正确的加载方案是
- 先请求到M3U8文件
- 加载切片(ts)文件
- 正常播放视频
这样做的好处是可以节省网络资源,当用户快进的时候,服务器可以直接定位到对应的ts文件进行加载,极大提升用户体验,可以减小服务器压力。
M3U8文件解读
随便点击一个电影

F12抓包,可以看到里面有m3u8文件和ts切片文件。
M3U8内容如下:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128,RESOLUTION=1142x480
900k_0X480_64k_25/hls/index.m3u8
所有的带#号的都是字段名称,不带#号的一般是路径或者文件名称。
900k_0X480_64k_25/hls/index.m3u8
很明显这里是一个网页的路径,对应一个新的M3U8文件

那么我们找到下面的M3U8文件,对比一下路径
https://pptv.1080tg.com/202312/21/BxEB9XJSw23/video/900k_0X480_64k_25/hls/index.m3u8
发现第一个M3U8文件里的路径就是第二个M3U8文件的URL。
第二个M3U8文件才是真实的视频的路径,内容如下:
#EXTM3U
#EXT-X-VERSION:3
#EXT-X-TARGETDURATION:4
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:3.560000,
https://pptv.shanshanku.com/202312/21/BxEB9XJSw23/video/900k_0X480_64k_25/hls/player0000.ts
#EXTINF:2.000000,
https://pptv.shanshanku.com/202312/21/BxEB9XJSw23/video/900k_0X480_64k_25/hls/player0001.ts
#EXTINF:1.520000,
https://pptv.shanshanku.com/202312/21/BxEB9XJSw23/video/900k_0X480_64k_25/hls/player0002.ts
#EXTINF:2.000000,
https://pptv.shanshanku.com/202312/21/BxEB9XJSw23/video/900k_0X480_64k_25/hls/player0003.ts
......
#EXT-X-ENDLIST
里面最重要的就是每一个ts文件的路径了,而且这个ts文件是没有加密的。
网站分析
接着我们来看一下整个过程,首先我们需要先通过这个网站把m3u8文件获取到。

直接搜一下网页的源代码,发现m3u8文件的链接就在这个url的字段里面。
我们拿到这个文件就可以去获取第二个m3u8文件,接着再取解析m3u8文件,然后爬取电影切片数据。
步骤如下:
- 通过网页源码获取第一层m3u8文件地址
- 下载第一层m3u8文件,获取第二层m3u8文件地址
- 解析第二层m3u8文件,爬取视频切片
- 对TS文件进行合并,还原回MP4文件
代码实现
第一步,我们需要从网页源码中,通过数据解析的方式,拿到第一层m3u8的链接
def GetFirstM3u8Url():# 拿到页面源码url = "https://www.yunbtv.org/vodplay/sandadui-2-1.html"resp= requests.get(url)resp.encoding="utf-8"tree=etree.HTML(resp.text)# 解析出urlscript_content=tree.xpath('//script[contains(text(), "player_aaaa")]/text()')[0]# 我们需要从脚本中提取JSON部分json_str = script_content[script_content.find('{'):script_content.rfind('}') + 1]# 解析JSON字符串data = json.loads(json_str)# 提取URL值url_value = data.get("url", "")print(url_value)
输出结果如下:

这样的话第一步就完成了。
第一层M3U8的链接拿到之后,接下来需要下载到第二层的M3U8文件
def DownloadM3u8File(first_m3u8_url):resp = requests.get(first_m3u8_url)resp.encoding = "utf-8"url2 = resp.text.split()[-1]# 移除第一个URL的最后一个分段(即去掉'/index.m3u8')base_url = first_m3u8_url.rsplit('/', 1)[0]# 第二层M3U8的地址Second_m3U8_Url = f"{base_url}/{url2}"#下载M3U8文件M3u8Resp=requests.get(Second_m3U8_Url)M3u8Resp.encoding = "utf-8"with open("m3u8.txt",mode="w",encoding="utf-8") as f:f.write(M3u8Resp.text)
实际效果:

现在我们的m3u8文件就已经下载下来了
接下来处理这个M3U8文件,用协程逐个下载ts文件
# 下载单个ts文件
async def download_one(url):print("正在下载:"+url)# 重试10次 防止下载失败for i in range(10):try:file_name=url.split("/")[-1]async with aiohttp.ClientSession() as session:async with session.get(url) as resp:content=await resp.content.read()async with aiofiles.open(f"./TsFiles/{file_name}",mode="wb") as f:await f.write(content)breakexcept:print("下载失败:"+url)await asyncio.sleep((i+1)*5)async def download_all_ts():# 准备好任务列表tasks=[]# 读取m3u8文件with open("m3u8.txt",mode="r",encoding="utf-8") as f:for line in f:# 排除所有#开头的if line.startswith("#"):continueline=line.strip()task=asyncio.create_task(download_one(line))tasks.append(task)# 等待任务全部结束await asyncio.wait(tasks)
这样的话,我们的ts文件就下载完成了

接着通过TS的文件名,进行合并
def MergeTsFiles():print("正在合并文件")name_list=[]with open("m3u8.txt",mode="r",encoding="utf-8") as f:for line in f:# 排除所有#开头的if line.startswith("#"):continueline=line.strip()file_name=line.split("/")[-1]name_list.append(file_name)with open(".\TsFiles\m3u8.txt", mode="w", encoding="utf-8") as f:for data in name_list:f.write("file "+"'"+data+"'"+"\n")# 记录当前的工作目录now_dir = os.getcwd()# 切换工作目录os.chdir("./TsFiles")os.system("D:\\ffmpeg\\ffmpeg.exe -f concat -safe 0 -i m3u8.txt -c copy output.mp4")# 所有操作后要把工作目录切换回来os.chdir(now_dir)print("文件合并完成")
这样的话,所有工作就完成了
相关文章:
使用爬虫爬取热门电影
文章目录 网站存储视频的原理M3U8文件解读网站分析代码实现 网站存储视频的原理 首先我们来了解一下网站存储视频的原理。 一般情况下,一个网页里想要显示出一个视频资源,必须有一个<video>标签, <video src"xxx.mp4"&…...
【unity小技巧】实现没有动画的FPS武器摇摆和摆动效果
文章目录 前言开始完结 前言 添加程序摇摆和摆动是为任何FPS游戏添加一些细节的非常简单的方法。但是并不是所以的模型动画都会配有武器摆动动画效果,在本文中,将实现如何使用一些简单的代码实现武器摇摆和摆动效果,这比设置动画来尝试实现类…...
C语言基础知识(6):UDP网络编程
UDP 是不具有可靠性的数据报协议。细微的处理它会交给上层的应用去完成。在 UDP 的情况下,虽然可以确保发送消息的大小,却不能保证消息一定会到达。因此,应用有时会根据自己的需要进行重发处理。 1.UDP协议的主要特点: …...
12月笔记
#pragma once 防止多次引用头文件,保证同一个(物理意义上)文件被多次包含,内容相同的两个文件同样会被包含。 头文件.h与无.h的文件: iostream是C的头文件,iostream.h是C的头文件,即标准的C头文…...
三、C语言中的分支与循环—for循环 (6)
本章分支结构的学习内容如下: 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句(4)分支结构 完 本章循环结构的…...
tolist()读取Excel列数据,(Excel列数据去重后,重新保存到新的Excel里)
从Excel列数据去重后,重新保存到新的Excel里 import pandas as pd# 读取Excel文件 file r"D:\\pythonXangmu\\quchong\\quchong.xlsx" # 使用原始字符串以避免转义字符 df pd.read_excel(file, sheet_namenameSheet)# 删除重复值 df2 df.drop_duplica…...
ChatGPT大升级,文档图像识别领域迎来技术革新
写在前面ChatGPT迎来重大升级冲击与机遇并存大模型时代的思考与探索■ 像素级OCR统一模型- UPOCR■ OCR大一统模型- SPTS v3■ 文档识别分析LLM应用 写在最后问卷抽奖 写在前面 2023 年 12 月 31 日第十九届中国图象图形学学会青年科学家会议在广州召开,该会…...
2023年全国职业院校技能大赛软件测试—测试报告模板参考文档
ERP(资源协同)管理平台测试报告 目录 ERP(资源协同)管理平台测试报告 1. 概述...
【BCC动态跟踪PostgreSQL】
BPF Compiler Collection (BCC)是基于eBPF的Linux内核分析、跟踪、网络监控工具。其源码存放于GitCode - 开发者的代码家园 想要监控PostgreSQL数据库的相关SQL需要在编译PostgreSQL的时候开启dtrace。下文主要介绍几个和PostgreSQL相关的工具,其他工具可根据需求自行了解。 …...
汽车架构解析:python cantools库快速解析arxml
文章目录 前言一、安装cantools二、官方说明文档三、cantools方法1、解析message的属性2、解析pdu中的signals3、根据message查找signals4、报文组成bytes 四、总结 前言 曾经有拿cantools来解析过dbc,用得比较浅,不知道可以用来解析arxml。最近有个需求…...
Vue 之 修饰符汇总
一、简介 在Vue中,修饰符是一种特殊的语法,用于修改指令或事件绑定的行为,它们以点号(.)的形式添加到指令或事件的后面,并可以改变其默认行为或添加额外的功能,如:禁止事件冒泡、数…...
如何通过内网穿透实现无公网IP远程访问内网的Linux宝塔面板
文章目录 一、使用官网一键安装命令安装宝塔二、简单配置宝塔,内网穿透三、使用固定公网地址访问宝塔 正文开始前给大家推荐个网站,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。…...
综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学
前言 有在自动化测试领域的小伙伴应该都知道,app和小程序自动化这一类的自动化测试在实际操作中有时候很棘手让人心烦,动不动就是用appium写代码脚本维护什么的,不仅步骤繁琐,环境配置方面也是繁琐无比,动不动就与客户…...
如何在ArcGIS Pro中指定坐标系
在进行制图的时候,为了实现某些特定的效果,需要指定特定的坐标系,但是现有的数据可能不是所需要的坐标系,这时候就需要对现有的数据坐标系进行处理,这里为大家介绍一下ArcGIS Pro中指定坐标系的方法,希望能…...
macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系”
macOS 老版本系统恢复中出现“MacBook Pro无法与恢复服务器取得联系” 网络问题系统时间问题镜像索引问题 网络问题 系统时间问题 镜像索引问题 恢复模式的 “实用工具 > 系统终端” 里执行如下 nvram IASUCatalogURLhttps://swscan.apple.com/content/catalogs/others/i…...
[C#]使用OpenCvSharp实现二维码图像增强超分辨率
【官方框架地址】 github.com/shimat/opencvsharp 【算法介绍】 借助于opencv自带sr.prototxt和sr.caffemodel实现对二维码图像增强 【效果展示】 【实现部分代码】 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin…...
优化|流形优化系列(一)
简介 流形优化是非线性优化的一个分支,它主要关注在特定的几何结构下进行优化。在流形优化中,优化问题通常是在黎曼流形上进行的,而非欧几里得空间。黎曼流形是带有黎曼度量的流形,该度量为流形上的每个点都定义了一个内积。这种…...
torch.where()函数
在深度学习的实现中,处理条件逻辑是一项常见而重要的任务。PyTorch 提供了一个强大的函数 torch.where(),它使得基于条件的张量操作变得既简单又高效。本文将深入探讨 torch.where() 的用法,并通过示例展示它在不同场景中的应用。 什么是 to…...
盖子的c++小课堂——第二十三讲:背包问题
前言 又是一次漫长的更新(我真不是故意的aaaaaaaaaaaaaaa),先不多说了,直接给我~坐下~说错了说错了,直接开始~ 背包问题----动态规划 背包问题(knapsack problem) 动态规划(dyna…...
k8s安装hostPath方式存储的PostgreSQL15
1.配置 PostgreSQL 的 ConfigMap cat > postgres-configmap.yaml << EOF apiVersion: v1 kind: ConfigMap metadata:name: postgres-configlabels:app: postgresnamespace: dev data:POSTGRES_DB: postgresdbPOSTGRES_USER: postgresadminPOSTGRES_PASSWORD: admin12…...
程序员的职业规划:到底是走技术路线还是管理路线
程序员职业规划:技术与管理的岔路口在软件测试行业深耕多年,你或许早已习惯在代码的迷宫中寻找漏洞,在数据的海洋里甄别异常。但当职业生涯的列车行至中途,一个现实的问题总会悄然浮现:是继续在技术的山峰上攀登&#…...
艾尔登法环帧率解锁神器:告别60帧限制的终极指南
艾尔登法环帧率解锁神器:告别60帧限制的终极指南 【免费下载链接】EldenRingFpsUnlockAndMore A small utility to remove frame rate limit, change FOV, add widescreen support and more for Elden Ring 项目地址: https://gitcode.com/gh_mirrors/el/EldenRin…...
cargo-dist未来展望:路线图分析与社区参与指南
cargo-dist未来展望:路线图分析与社区参与指南 【免费下载链接】cargo-dist 📦 shippable application packaging 项目地址: https://gitcode.com/gh_mirrors/ca/cargo-dist cargo-dist 作为一款强大的应用打包工具,致力于为开发者提供…...
人机协同智能体(Human-in-the-loop)设计模式与最佳实践
从零到落地:构建高效可控的人机协同智能体(Human-in-the-loop)设计模式与最佳实践副标题:从ChatGPT插件监控到企业级合规风控,覆盖全场景的HITL实践指南摘要/引言 问题陈述 2023年被称为大语言模型(LLM&…...
如何将图片上的中文翻译成西班牙语?一键搞定电商详情页,低成本出海拉美市场(实战教程)
前言 在跨境电商越来越卷的今天,很多卖家开始把目光从欧美市场转向一个被低估的区域——拉丁美洲(LATAM)和西班牙市场。 但真正做起来你会发现,第一个拦路虎不是物流、不是选品,而是: ❗ 图片语言问题 尤…...
第26课:OpenClaw|日志审计与问题诊断
文章目录26.1 OpenClaw的日志体系与日志级别日志的“两个表面”日志级别的分层逻辑WebSocket日志的三级样式Cache-Trace日志:穿透Agent上下文的黑盒26.2 工作目录中的.jsonl日志文件分析三类关键日志文件读取日志的三种方式三类日志的关联追踪法26.3 结构化日志的收…...
基于MCP协议构建AI驱动的网络安全情报聚合与自动化分析平台
1. 项目概述:一个为AI工作流赋能的网络安全情报中枢 如果你是一名安全工程师、渗透测试人员,或者正在构建一个需要实时威胁情报的AI智能体,那么你肯定对这样的场景不陌生:为了评估一个供应商的风险,你需要在浏览器里同…...
ASMA-Tune:大语言模型在汇编代码理解中的创新应用
1. ASMA-Tune:大语言模型在汇编代码理解领域的突破在逆向工程和漏洞分析领域,汇编代码理解一直是个令人头疼的难题。想象一下,你面前是一堆看似杂乱无章的机器指令,没有变量名,没有注释,更没有高级语言那种…...
【开源】电商运营场景的 Agent :EcomPilot经营诊断神器 附github
github地址 https://github.com/baibai-awd/ecommerce-ops-agent一个面向电商运营场景的 Agent 项目:EcomPilot 电商经营诊断 Agent。这个项目不是简单的聊天机器人,而是围绕真实业务流程设计的智能分析系统。它可以自动读取电商运营数据,分析…...
点云配准算法进化史:从ICP的‘硬匹配’到CT-ICP的‘连续时空’,理解GICP背后的概率模型
点云配准算法进化史:从ICP的刚性匹配到CT-ICP的时空连续性 在三维感知技术领域,点云配准算法的发展犹如一部浓缩的技术进化史。从早期简单的几何匹配到如今融合概率模型与时空连续性的复杂系统,每一次算法迭代都对应着实际应用场景中亟待解决…...
