利用python爬取m3u8格式视频的具体实现
作者:信息不对等 发布时间:2021-04-10 21:45:09
m3u8原理
当我们在网页播放视频时,网页向服务器发起一个以.m3u8结尾的连接请求,服务器会将具体的.ts文件链接路径发送给网页,网页接收这写链接路径,并向这些链接发送请求,请求到的资源就是.ts视频文件,他和我们常见的mp4文件只是封装格式的不同,而且.ts文件的大小很小,我爬取的.ts文件只有六秒的视频文件。之后网页将这些.ts文件整合在一起并进行播放。
脚本环境
python3.8、win 10
爬取步骤
python要做的事情
1、选择可以爬取的视频网站
2、获取.m3u8的URL路径
3、通过requests.get获取.ts文件路径
4、保存.ts文件
5、合并.ts文件为mp4格式
步骤的具体实现
1、视频网站:https://www.3s8m.com/
2、随便选择一个视频进入播放页面,按下F12或者Fn+F12,打开审查元素,选择网络,刷新页面,暂停视频,在审查元素的网络页面选择XHR(没有可以直接在全部搜索m3u8),找到以m3u8结尾的数据包,点击获取URL
3、python 编写代码请求该URL,打印返回的数据;代码如下
import requests
url = “用第二部找到的URL填入”
results = requests.get(url) #发送get请求
results.encoding=“utf8” #设置编码格式,从网页源码中的head中可以看编码格式,这步不关键
print(results.text) #打印结果
results.close() #关闭
4、可以发现第3步中打印结果有很多URL地址,这些地址就是ts文件的地址,python下载ts文件
import request
url =“填入获取到的ts文件的URL”
results = requests.get(url)
results.encoding =“utf8”
with open("./a.ts",“wb”) as file:
file.write(results.content)
results.close()
5、合并全部的ts文件,调用python的os库,使用系统命令(copy /b a.ts+b.ts a.mp4)进行合并
import os
os.system(“copy /b a.ts+b.ts a.mp4”)
python细节处理说明
1、上述是通过手动查找获取的m3u8地址,那么为什么不用python去爬取,如果用python去爬取那么就需要对爬取的内容进行分析检索,我使用正则进行检索,也可以用xpath、bs4等方式进行检索。
2、一个m3u8地址会对应多个ts文件地址,我们应该对同一个m3u8的ts地址进行整体保存,下载后进行整合在一起变为一个m3u8对应一个视频
3、我们在浏览上述提供的网站时会发现,有些资源有不通播放源,有些版源不能用,那么我们在进行检索的时候可以多加一个进行源切换的操作
4、至于保存的文件名、文件路径这些自己返回,具体的代码下面会提供一个参考。
参考代码
使用代码的前提条件及说明:
1、在代码文件的目录下建一个名为ts_path的文件夹用于保存爬取过程中的临时文件(.ts文件)
2、保存的视频会存放与代码文件同一目录线下,视频名称为 集数.mp4
3、视频下载完,ts_path中的文件需要手动删除,由于之前使用os.system进行删除,误删了我不少源码,决定不加删除代码防止意外
4、代码只是用与上述提供的网站,其他网站需要自己进行修改
import requests
import re
import os
URL = "输入URL" #视频URL
resources = 0 #播放源选择
episode_urls = [] #存放章节URL
episode_names = [] #存放章节名称
m3u8_urls = [] #存放ts文件的URL
def get_episode(URL,resources): #获取章节名和路径
results = requests.get(URL)
results.encoding = "utf-8"
all = results.text
results.close()
episode = re.findall('<ul class="dslist-group">.*?</ul>', all, flags=re.S)
b = re.finditer('href=".*?</a>', episode[resources],flags=re.S)
for i in b:
i = i[0].replace('href="', "").replace('"', "")
episode_urls.append("https://www.3s8m.com" + i.split('>', 1)[0])
episode_names.append(i.split('>', 1)[1].replace("</a>", ""))
print(episode_names)
print(episode_urls)
def get_ts(episode_urls): #获取ts文件路径
for i in episode_urls:
results = requests.get(i)
results.encoding = "utf8"
results = re.search('https:.*?\.m3u8', str(results.text),flags=re.S)
m3u8_urls.append(results[0].replace("\\", ""))
print(m3u8_urls)
def download_video(episode_names, m3u8_urls): #下载ts文件并整合为mp4文件
for i in range(len(m3u8_urls)):
try:
print(m3u8_urls[i])
results = requests.get(m3u8_urls[i])
results.encoding = "utf8"
all = re.finditer("https://.*?#", results.text, flags=re.S)
results.close()
cmd = []
n = 0
for j in all:
n += 1
ts_url = j[0].replace("\n#", "")
cmd.append(f'{n}.ts')
results = requests.get(ts_url,)
results.encoding = "utf8"
with open(f"./ts_path/{n}.ts", "wb") as file:
file.write(results.content)
results.close()
print(f"{n}.ts 下载完成")
os.chdir("ts_path")
if ("ts_path" in os.getcwd()):
cmd = "+".join(cmd)
cmd = f"copy /b {cmd} {episode_names[i]}.mp4"
os.system(cmd)
os.system(f"move {episode_names[i]}.mp4 ../")
os.chdir("../")
print(f"{episode_names[i]}.mp4 下载成功")
except Exception as e:
print(e)
exit(0)
if __name__ == '__main__':
get_episode(URL, resources)
get_ts(episode_urls)
download_video(episode_names, m3u8_urls)
总结
来源:https://blog.csdn.net/weixin_44975787/article/details/121420151


猜你喜欢
- 1. 引言本文是数独游戏问题求解的第二篇,在前文中我们使用回溯算法实现了最简单版本的数独游戏求解方案。本文主要在前文解决方案的基础上,来思考
- SQL Server 2019 Enterprise (x64) - DVD (Chinese-Simplified)企业版ed2k://|
- numpy的delete是可以删除数组的整行和整列的,下面简单介绍和举例说明delete函数用法:numpy.delete(arr, obj
- 一、结论语法结构: limit offset, rows结论:rows 相同条件下,offset 值越大,limit 语句性能越差二、测试执
- 概述在我们使用内置打印函数print时,打印出的Python数据结构对象总是一行的输出的方式,这样对数据结构较复杂或数据较多的对象的显示并不
- 正态分布(Normal distribution),也称“常态分布”,又名高斯分布(Gaussian distribution)正态曲线呈钟
- 在使用一些 Javascript 框架时,或许会看到类似的代码var MyClass = new Class({initialize: fu
- commands模块的适用commands模块是python的内置模块,他共有三个函数,使用help(commands)可以查看到FUNCT
- 本文实例为大家分享了微信小程序实现视频播放器发送弹幕的具体代码,供大家参考,具体内容如下一、视频播放器video-detail 视频播放器s
- 本文实例讲述了JS前端加密算法。分享给大家供大家参考,具体如下:解密操作对服务器性能颇有消耗。寻思着能不能在前端完成。于是找到了crypto
- 摘要一直比较想知道图片经过卷积之后中间层的结果,于是使用pytorch写了一个脚本查看,先看效果这是原图,随便从网上下载的一张大概224*2
- 聚合函数 count,max,min,avg,sum... select count (*) from T_Employee select
- 创建一个SpringBoot项目其他不赘叙了,引入MyBaties、MySql依赖创建mysql表CREATE TABLE sp_users
- 最近新接触Mysql,昨天新建一个表用于存储表结构信息:create table tablist(TABLE_SCHEMA varchar(
- Microsoft? SQL Server? 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存
- 一:模板要了解jinja2,那么需要先理解模板的概念。模板在Python的web开发中广泛使用,它能够有效的将业务逻辑和页面逻辑分开,使代码
- 逻辑门是任何数字电路的基本构建块。它需要一两个输入并根据这些输入产生输出。输出可能为高 (1) 或低 (0)。逻辑门使用二极管或晶体管实现。
- 油画的实现原理油画简单的理解是带有艺术感的图像,色彩相对于原图要更加鲜艳,但却是失真的。而且对于喜欢欣赏艺术的读者,肯定或多或少关注过油画,
- PHP Session 变量当运行一个应用程序时,你会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程
- 1. 错误描述之前在学习Python的过程中,导入自己写的包文件时,与之相关的方法等都会被划红线,但并不影响代码执行,如图:看着红线确实有点