python爬虫+ffmpeg批量下载ts文件,解密合并成mp4
标题
python爬虫+ffmpeg批量下载ts文件,解密合并成mp4
文章目录
- 标题
- 前言
- 一、分析目标
- 二、寻找url规律
- 三、写代码
- 总结
前言
(第一次写博客,写的不好请见谅哈~~)
目标是大鹏教育里边的直播回放,他的回放是m3u8格式的,还有ts加密,这是分析过后才知道的,大家可以忽略哈,下边会有详细的过程!
一、分析目标
先进站点看看——大鹏教育拿一个免费的课程试试,
进视频F12看代码
可以看到video的链接是blob加密的,这个我查了一下,看不懂,就没在这方面下手,如果有大佬会可以指点一下小弟,嘿嘿~~~
在页面搜索mp4文件,并没有
去网络中查mp4
json数据格式化以后是这样的
这里有mp4文件,但是呢,打不开
果断换方向,在网络中搜索m3u8(一般都是这个套路,要有这个敏感性)
直接找URL的,别的300的表示响应为m3u8,是ts文件,
这里有两个url,先看下边那个,可以发现是表示清晰度
可以看到第一个url里边是ts文件,还有一个key,这说明ts加密了,你下载ts不解密是看不了的,ffmpeg有解密功能
二、寻找url规律
我们做的是批量爬取,一定要去找url的规律,然后写代码,批量爬取。
m3u8的url: https://hls.videocc.net/ef4825bc7e/f/ef4825bc7edbfa2d5669dc739da4743f_3.m3u8?pid=1627609329566X1284092&device=desktop
实测?后的可以删除,不影响,删除后为:
https://hls.videocc.net/ef4825bc7e/f/ef4825bc7edbfa2d5669dc739da4743f_3.m3u8
再去查看别的视频的m3u8视频,可以发现https://hls.videocc.net/ef4825bc7e/f/
是一样的,改变的是ef4825bc7edbfa2d5669dc739da4743f_3这个
还记得这个嘛
这个的url为: https://www.dapengjiaoyu.cn/dp-course/api/courses/stages/jxptdx8pvb/chapters?courseId=jxpjtxnsow&page=1&size=16
这个里边有课程的名称(title里边),有vid,所以先爬取这个页面,提取title和vid,然后用vid加上https://hls.videocc.net/ef4825bc7e/f/,构造我们的m3u8地址,思路理清楚了,上代码。
三、写代码
我直接上完整的代码了,在代码里边解释,QAQ
import requests
import re
import subprocess #后续会用到,控制终端的库
import os
from tqdm import tqdm #为了好看,加上进度条
from time import sleep
from multiprocessing.dummy import Pool #多线程的s = '这里是你的cookies,直接复制过来就行'#处理cookies的方式
cookies = {}
s = s.encode('utf-8').decode('latin1') #如果cookies有中文,这样处理编码就不会报错了
for k_v in s.split(';'):k,v = k_v.split('=',1)cookies[k.strip()] = v.replace('"','')def spider(url):x = 0 #计数,防止出现重复的文件名,打断ffmpeg的合并headers = { #防盗链建议加上'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36 Edg/92.0.902.55','Host': 'www.dapengjiaoyu.cn','Referer': 'https://www.dapengjiaoyu.cn/details/course?type=VIP&courseId=ijmiw8ve&faid=0853c508-9328-47e6-b65a-7b155523e509&said=0853c508-9328-47e6-b65a-7b155523e509&fuid=kewhtyxxuk&suid=&d=0&suu=51898ffd-988e-4455-8d8e-4158660db282&suc=1&state=LIVING'}#一定要json处理menu = requests.get(url=url,headers=headers,cookies=cookies).json()for i in tqdm(menu):x += 1 #计数videoName = i['title'] #保存的视频名videoName = videoName.replace(' ','') #将空格替换掉,如果有空格,ffmpeg会报错className = i['videoContent']['title'] #课程的名字,作为文件夹名字#大鹏教育调酒精品试学课莫吉托.mp4,将课程名字提取出来className = re.findall('大鹏教育(.*?课)', className)[0]#获取vid,将后边的_e替换成.m3u8vid = i['videoContent']['vid'].replace('_e', '_3.m3u8')#构造urlm3u8_url = 'https://hls.videocc.net/ef4825bc7e/f/' + vidm3u8_data = requests.get(m3u8_url).text#提取m3u8里边的ts文件的urlts_urls = re.findall('(https:.*?\.ts)', m3u8_data)#下载每一个ts文件for ts_url in ts_urls:#给下载的ts命名index = re.findall('_3_(\d+\.ts)', ts_url)[0]ts = requests.get(url=ts_url).content#这是保存的函数,下边解释write(className,ts,index)#将m3u8里边的ts url替换掉,成ts文件名,为了方便合并m3u8_data = m3u8_data.replace(ts_url,index)if 'URI' in m3u8_data:#判断是否有密钥,有就提取url下载keykey_url = re.findall('URI="(.*?key)', m3u8_data)[0]key = requests.get(url=key_url).content#className是文件夹的名称with open(className + '\\' + 'key.m3u8','wb') as f3:f3.write(key)#将kye的url替换成本地的key密钥,方便合并m3u8_data = m3u8_data.replace(key_url,'key.m3u8')#保存函数write(className, m3u8_data)sleep(5)#获取当前程序路径path = os.getcwd()#将程序路径改为视频保存的路径os.chdir(className)sleep(1)#利用ffmpeg合并视频的函数,下边有解释merge(videoName,x)#沉睡20秒,让视频有足够的时间合并sleep(20)#删除除mp4文件以为的文件的函数,下边解释remove()sleep(2)#再将程序路径改回来os.chdir(path)print(f'合成完毕:{videoName}')#保存文件的函数
def write(name,data,index=''):#创建文件夹if not os.path.exists(name):os.mkdir(name)#因为保存的格式不一样,需要判断一下if type(data) == str:#这是m3u8文件with open(name + '\\' + 'index.m3u8','w') as f1:f1.write(data)else:#这是ts文件,index是上边的序号with open(name + '\\' + index, 'wb') as f2:f2.write(data)#这是利用ffmpeg的函数
def merge(title,x):#还记得上边那个计数的x嘛,在这里用,因为如果名称一样的话,ffmpeg会报错c = 'ffmpeg -allowed_extensions ALL -i index.m3u8 -c copy {}.mp4'.format(str(x)+title)#在终端中输入ffmpeg的命令,合并视频subprocess.Popen(c,shell=True)#删除多余文件的函数
def remove():con = Truewhile con:li = os.listdir()for i in li:#我曾想检测到mp4合成以后再删除文件,就不用sleep()了,但是ffmpeg不是一次性合并完成,所以只能用sleep()了,如果大佬有好的方法,可以指点小弟一下if 'mp4' in i:for j in li:if 'mp4' not in j:os.remove(j)con = Falsebreakif __name__ == '__main__':#这是处理多页的,如果你是单页,把4改了就行for i in range(1,4):i = 'https://www.dapengjiaoyu.cn/api/old/courses/stages/5029f038ac934f78a6f821c2824787f8/chapters?courseId=jcrip94i&page=' + str(i)spider(i)
运行后这样的
ffmpeg的输出就在控制台了,我查了subprocess.Popen的使用参数,加上后并没有什么用,还望大佬赐教
stdin stdout和stderr:
stdin stdout和stderr,分别表示子程序的标准输入、标准输出和标准错误。可选的值有PIPE或者一个有效的文件描述符(其实是个正整数)或者一个文件对象,还有None。如果是PIPE,则表示需要创建一个新的管道,如果是None,不会做任何重定向工作,子进程的文件描述符会继承父进程的。另外,stderr的值还可以是STDOUT,表示子进程的标准错误也输出到标准输出。
总结
这个代码的运行需要你手动找出,这个的url,算是缺点吧QAQ
好了,就完成了,关于ffmpeg的用法网上太多了,不过我要说,建议把key和ts和m3u8文件放一块,这样key,ts的路径就可以只写文件名了(相对路径)。
只要你有思路,有方法,天下网站任你爬
好了,到这里就结束了,如果你觉得有帮助,可以点个赞赞,我是一个热爱网络安全的爬虫小白,欢迎大家和我一起学习进步!
python爬虫+ffmpeg批量下载ts文件,解密合并成mp4相关推荐
- Python3 根据m3u8下载视频,批量下载ts文件并且合并
Python3 根据m3u8下载视频,批量下载ts文件并且合并 m3u8是苹果公司推出一种视频播放标准,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少 ...
- 用python和ffmpeg批量合成bilibili缓存的m4s成mp4
我的目录格式是这样的 所以直接脚本处理一下就好了 ffmpeg安装:https://ffmpeg.zeranoe.com/builds/win64/static/ 直接去上面链接里找一个下载解压 哪个 ...
- python爬虫实现批量下载百度图片
今天和小伙伴们合作一个小项目,需要用到景点图片作为数据源,在百度上搜索了一些图片,感觉一个一个手动保存太过麻烦,于是想到用爬虫来下载图片. 本次代码用到了下列一些python模块,需要预先安装Beau ...
- Python 爬虫 m3u8的下载及AES解密
python爬虫 m3u8的下载及AES加密的解密 前言 2023.1.23更新 线程池版 完整代码 异步协程版 前言 这里与hxdm分享一篇关于m3u8视频流的爬取下载合并成mp4视频的方法,并且支 ...
- python拼接大量ts文件_Python爬取.ts文件,合并为mp4
目标:爬影视网站ts文件到本地,合并成mp4文件 下载ts文件 本着不重复造轮子的精神(好吧其实是我懒),想用迅雷批量下载爬取,但是迅雷提供的通配符过于简单无法构造URL,只能自己写脚本 如下: # ...
- Mac os X 系统,TS视频如何合并成MP4
通过Chrome的Network面板看不到任何视频格式的请求,反而有一个叫.m3u8的文件,和后续一坨.ts结尾的连续请求. Chrome的Network面板的请求 原理 视频网站为了提高视频加载速度 ...
- 爬虫案例:利用python爬虫关键词批量下载高清大图
环境: python3+pycharm+requests+re+BeatifulSoup+json 这个确实也属实有一些勉强,不少童鞋私信问我有木有 下载大图 的源码,我说可能会有,现在分享给大家. ...
- 利用python爬虫关键词批量下载高清大图!
前言 在上一篇 写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片 !中,我们在未登录的情况下实现了图虫创意 无水印高清小图 的批量下载.虽然小图能够在一些移动端可能展示的还行,但是 ...
- Python爬虫实战批量下载高清美女图片,男生最爱的案例吧!
彼岸图网站里有大量的高清图片素材和壁纸,并且可以免费下载,读者也可以根据自己需要爬取其他类型图片,方法是类似的,本文通过python爬虫批量下载网站里的高清美女图片,熟悉python写爬虫的基本方法: ...
最新文章
- 2020年总结以及21年规划
- tf里面InteractivateSession()与Session()的区别
- linux tasklet函数,14.9.5 实例:Tasklet演示
- Android 简单基站定位程序
- 中小型企业部分拓朴结构配置方法
- 【渝粤教育】国家开放大学2018年秋季 0692-22T化工设备机械基础 参考试题
- 倒序查10条数据_餐饮业总营收增量七成由外卖拉动,天眼查数据显示今年我国新增相关企业超10万家...
- 5月份----要做的
- php作业制作htm,PHP作业-HTML-2020-09-28
- python廖雪峰教程 学习笔记
- c语言编写程序统计某给定ascii文件中个字母的出现频率,2016年浙江理工大学理学院C语言程序设计考研复试题库...
- VS 201x C++ 编译错误解决方法集
- 微信iOS 8.0.8正式版重磅更新啦,这些新功能超好用!!
- 社区发现算法——(Spectral Clustering)谱聚类算法
- 未找到类型或命名空间名称 (是否缺少 using 指令或程序集引用?)
- 查找中位数(分治策略)
- 2021年职业院校技能大赛“网络安全”项目江西省A模块
- 2020全国普通高校大学生竞赛排行榜出炉!
- 面试经历|为即将找工作的你保驾护航
- Google首页电吉他源代码下载
热门文章
- 在webpack中使用vue的准备
- poiexcel 读取引用列_java用poi读取Excel表格中的数据
- Android公告栏的几种实现方式与优缺点
- SAP PS模块的预算管理
- 阿里巴巴大神发布的Java零基础笔记,实战教程多到手软,跪了
- 大可乐android 4.3刷机包,国产Android 4.2:
- pdf转换成ppt转换器
- sts html自动提醒,STS、Eclipse中编写java、html、javascript文件的自动提示设置 html标签属性提示 总结...
- AI智能视频技术如何应用在文物古迹建筑日常养护监管场景中?
- 手机中丢失了数据怎么办