基础篇3 浅试Python爬虫爬取视频,m3u8标准的切片视频

浅试Python爬取视频

1.页面分析

  • 使用虾米视频在线解析
  • 使用方式:https://jx.xmflv.cc/?url=目标网站视频链接
  • 例如某艺的视频 原视频链接

解析结果:
在这里插入图片描述

1.1 F12查看页面结构

在这里插入图片描述
我们发现页面内容中什么都没有,video标签中的src路径也不是视频的数据。

1.2 老规矩看网络请求中的过滤的XHR

发现一堆没卵用的数据返回,直到我们看到这个mixed.m3u3结尾的返回结果,及后续高度相似的请求数据
在这里插入图片描述

1.3解析mp2t媒体文件

将上一步中的mp2t媒体文件随机挑选一个下载下来。打开后就是我们的目标视频。ok目的达到。
在这里插入图片描述接下来我们要做的就是将返回的mixed.m3u8解析出来

2.功能实现

2.1 拿到m3u8的文件

#-*- coding:UTF-8 -*-

import requests
import os
import sys


res = requests.get('https://vip.ffzy-online2.com/20221231/3848_0533f6da/2000k/hls/mixed.m3u8')
m3u8_obj = res.text
print(m3u8_obj)

可以看到打印结果
在这里插入图片描述
到这里我们就需要拿到ts结尾的字符串,然后筛选出以ts结尾的字符串。

2.2 解析m3u8的信息

m3u8 = m3u8_obj.split('\n')
# 匹配*.ts结尾的字符串
rst = [s for s in m3u8 if s.endswith('.ts')]
print(rst)

我们可以看到打印结果
在这里插入图片描述

接下来就需要拼接字符串获取到视频的路径,下载下来之后再进行拼接。

2.3 下载视频

baseurl= 'https://vip.ffzy-online2.com/20221231/3848_0533f6da/2000k/hls/'
# 下载并保存TS分片
for i, url in enumerate(rst):
    response = requests.get(baseurl+url, stream=True)
    with open(f'segment{i + 1}.ts', 'wb') as out_file:
        out_file.write(response.content)

于是我们可以看到
在这里插入图片描述
现在切片视频正确拿到了

  • 可以利用第三方软件进行视频合并
  • 可以先创建一个.MP4格式的文件使用python写入文件的方法进行合并

2.4 合并

# 将下载的视频合并起来
# 拿到文件名
file_names = os.listdir('./video')
# 最终视频路径
target_video = open('./output.mp4','ab')
# 遍历全部视频集合
for file in file_names:
  with open('./video/'+file,"rb") as f:
    target_video.write(f.read())
    f.close()
target_video.close()

我只是下载的部分视频,成功合成看结果:

在这里插入图片描述

3.整合一下

# -*- coding:utf-8 -*-

import requests
import os
import sys

class getvideo(object):
  def __init__(self) -> None:
    self.baseurl = 'https://vip.ffzy-online2.com/20221231/3848_0533f6da/2000k/hls/'  # ts视频的路径
    self.m3u8url = 'https://vip.ffzy-online2.com/20221231/3848_0533f6da/2000k/hls/mixed.m3u8' # m3u8文件的路径
    self.ts_video = [] # 存放解析后的ts视频信息

  def geturlbyts(self):
    res = requests.get(self.m3u8url)
    m3u8_obj = res.text 
    m3u8 = m3u8_obj.split('\n')  # 按照换行分割
    # 匹配*.ts结尾的字符串
    self.ts_video = [s for s in m3u8 if s.endswith('.ts')]

  # 下载并保存TS分片
  def downloadvideobyts(self):
    for i, url in enumerate(self.ts_video):
      response = requests.get(self.baseurl+url, stream=True)
      with open(f'.\\video\\'+self.ts_video[i], 'wb') as out_file:
        sys.stdout.write("下载进度:{0:.2f}%" .format(float((i+1)/len(self.ts_video))*100)  + '\r')
        sys.stdout.flush()
        out_file.write(response.content)


  def mergevideo(self):
    # 将下载的视频合并起来
    # 拿到文件名
    file_names = os.listdir('./video')
    # 最终视频路径
    target_video = open('./output.mp4','ab')
    # 遍历全部视频集合
    for file in file_names:
      with open('./video/'+file,"rb") as f:
        print("当前合并到{}".format(file))
        target_video.write(f.read())
      f.close()
    target_video.close()

dlvideo = getvideo()
dlvideo.geturlbyts()
# 当前目录创建一个video文件夹 用来存储ts分片视频
# 创建个文件夹存储视频
os.makedirs('video',exist_ok=True)
dlvideo.downloadvideobyts()
dlvideo.mergevideo()
print("合并完成")

单线程着实慢,后续继续更新学习。
在这里插入图片描述
以上仅供学习使用,下载后请于24小时内删除。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VUE运行项目后,只有local地址,没有network地址(添加nerwork地址)

使用前 使用后 解决方案 1.找到build文件夹下的webpack.dev.conf.js文件,更改messages中的内容 devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({compilationSuccessInfo: {messages: [App running: ,Local: http://${devWebpackConfig.devServer.hos…

【前端Vue】社交信息头条项目完整笔记第3篇:三、个人中心,TabBar 处理【附代码文档】

社交媒体-信息头条项目完整开发笔记完整教程(附代码资料)主要内容讲述:一、项目初始化使用 Vue CLI 创建项目,加入 Git 版本管理,调整初始目录结构,导入图标素材,引入 Vant 组件库,移动端 REM 适配。二、登录注册准备,实现基本登录功能,登录状…

ObjectiveC-08-OOP面向对象程序设计-类的分离与组合

本节用一简短的文章来说下是ObjectiveC中的类。类其实是OOP中的一个概念,概念上简单来讲类是它是一组关系密切属性的集合,所谓的关系就是对现实事物的抽象。 上面提到的关系包括很多种,比如has a, is a,has some等&…

交互设计师、UI设计师、视觉设计师面试作品集包装模板figma源文件

页面数量:19页 页面尺寸:1920*1080PX 交付格式:figma 赠送文件:24款高质量样机 交付文件:作品集模板源文件、作品集包装psd源文件、作品集所用字体文件 该作品集虽然只有19页,但可根据需求复制作品集里已有…

offsetof宏定义的使用和模拟实现详解

目录 一.offsetof宏定义的使用二.offsetof宏的模拟实现三.总结 一.offsetof宏定义的使用 offsetof的第一个参数是数据类型(结构体或联合体),第二个参数是偏移量 (offsetof用于计算结构体和联合体的偏移量) 返回值的类型是size_t(无…

Spring Cloud微服务入门(二)

微服务的技术栈 服务治理: 服务注册、发现、调用。 负载均衡: 高可用、集群部署。 容错: 避免雪崩、削峰、服务降级。 消息总线: 消息队列、异步通信,数据一致性。 网关: 校验路径、请求转发、服务集成…

Golang 开发实战day07 - Functions

Golang 教程07 - Functions 1. Functions 1.1 什么是函数? 在 Golang 中,函数就像是代码的超级组合体,可以将一段代码封装成一个独立的单元,以便重复使用。 1.2 函数声明 func funcName(parameter1 type1, parameter2 type2)…

利用sqoop实现sql表数据导入到Hadoop

1.在开发这创建好sql表后,开始执行下面步骤 2.sqoop的安装路径,我这里放在以下位置 3. 进入到option2脚本中,下面是脚本里的内容 下面四点要根据情况随时更改: 1>jdbc:mysql://node00:3306/数据库名 2>sid,sname->前…

网站如何运用百度文心一言API进行AI内容创作?

网站如何运用百度文心一言API进行AI内容创作? 当我们做好一个网站的时候会因为创作内容而发愁,随着chatgpt的出现,内容创作已经不再是什么困难的事情,但是由于gpt是国外的,在国内使用有诸多不便,因此我们今…

数据结构—堆

什么是堆 堆是一种特殊的树形结构,其中每个节点都有一个值。堆可以分为两种类型:最大堆和最小堆。在最大堆中,每个节点的值都大于等于其子节点的值;而在最小堆中,每个节点的值都小于等于其子节点的值。这种特性使得堆…

基于FPGA的SPI_FLASH程序设计

SPI_FLASH简介 spi_flash是一种通用存储器,也称为SPI NOR Flash或SPI Flash。它使用SPI(Serial Peripheral Interface)接口进行通信,可以通过串行方式读写数据。spi_flash的特点是工作电压低,体积小,读写速…

使用SpringBoot实现的登录注册后端功能

1、系统演示视频(演示视频) 2、需要交流和学习请联系

高级IO/多路转接-select/poll(1)

概念背景 IO的本质就是输入输出 刚开始学网络的时候,我们简单的写过一些网络服务,其中用到了read,write这样的接口,当时我们用的就是基础IO,高级IO主要就是效率问题。 我们在应用层调用read&&write的时候&…

elementui 实现一个固定位置的Pagination(分页)组件

系列文章目录 一、elementui 导航菜单栏和Breadcrumb 面包屑关联 二、elementui 左侧导航菜单栏与main区域联动 三、elementui 中设置图片的高度并支持PC和手机自适应 四、 elementui 实现一个固定位置的Pagination(分页)组件 文章目录 系列文章目录…

【css】使用display:inline-block后,元素间存在4px的间隔

问题:在本地项目中使用【display: inline-block】,元素间存在4px间隔。打包后发布到外网又不存在这个问题了。 归根结底这是一个西文排版的问题,英文有空格作为词分界,而中文则没有。 此时的元素具有文本属性,只要标签…

CNAS软件测试公司有什么好处?如何选择靠谱的软件测试公司?

CNAS认可是中国合格评定国家认可委员会的英文缩写,由国家认证认可监督管理委员会批准设立并授权的国家认可机构,统一负责对认证机构、实验室和检验机构等相关机构的认可工作。 在软件测试行业,CNAS认可具有重要意义。它标志着一个软件测试公…

uniapp android 原生插件封装--入门篇

本文将介绍uniapp 插件封装官方例子的搭建,运行。和注意事项,避坑 1、文档地址:简介 | uni小程序SDK 开发者须知 | uni小程序SDK Android平台第三方插件开发指导 - DCloud问答 这个介绍插件与原生的架构 2、下载官方示例:百度…

JAX深度学习库入门

JAX简介 https://www.bilibili.com/video/BV1Sb4y1b7rK/?spm_id_from333.999.0.0&vd_sourceb2549fdee562c700f2b1f3f49065201b JAX is NumPy wiht Autograd , XLA and Composable (function) transformations, brought together for high-performance machine learning …

hive词频统计---文件始终上传不来

目录 准备工作: 文件内容: 创建数据库及表 将文件上传到:上传到/user/hive/warehouse/db1.db/t_word目录下 hive里面查询,始终报错:(直接查询也是不行) 解决方案: 准备工作&am…

【Django学习笔记(三)】BootStrap介绍

BootStrap介绍 前言正文1、BootStrap 快速了解2、初识BootStrap2.1 下载地址2.2 创建目录2.3 引入BootStrap2.4 使用BootStrap 3、BootStrap 组件&样式3.1 导航条3.2 栅格系统3.3 container3.3.1 container3.3.2 container-fluid 3.4 面板3.5 媒体对象3.6 分页3.7 图标3.7.…