标题

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相关推荐

  1. Python3 根据m3u8下载视频,批量下载ts文件并且合并

    Python3 根据m3u8下载视频,批量下载ts文件并且合并 m3u8是苹果公司推出一种视频播放标准,是一种文件检索格式,将视频切割成一小段一小段的ts格式的视频文件,然后存在服务器中(现在为了减少 ...

  2. 用python和ffmpeg批量合成bilibili缓存的m4s成mp4

    我的目录格式是这样的 所以直接脚本处理一下就好了 ffmpeg安装:https://ffmpeg.zeranoe.com/builds/win64/static/ 直接去上面链接里找一个下载解压 哪个 ...

  3. python爬虫实现批量下载百度图片

    今天和小伙伴们合作一个小项目,需要用到景点图片作为数据源,在百度上搜索了一些图片,感觉一个一个手动保存太过麻烦,于是想到用爬虫来下载图片. 本次代码用到了下列一些python模块,需要预先安装Beau ...

  4. Python 爬虫 m3u8的下载及AES解密

    python爬虫 m3u8的下载及AES加密的解密 前言 2023.1.23更新 线程池版 完整代码 异步协程版 前言 这里与hxdm分享一篇关于m3u8视频流的爬取下载合并成mp4视频的方法,并且支 ...

  5. python拼接大量ts文件_Python爬取.ts文件,合并为mp4

    目标:爬影视网站ts文件到本地,合并成mp4文件 下载ts文件 本着不重复造轮子的精神(好吧其实是我懒),想用迅雷批量下载爬取,但是迅雷提供的通配符过于简单无法构造URL,只能自己写脚本 如下: # ...

  6. Mac os X 系统,TS视频如何合并成MP4

    通过Chrome的Network面板看不到任何视频格式的请求,反而有一个叫.m3u8的文件,和后续一坨.ts结尾的连续请求. Chrome的Network面板的请求 原理 视频网站为了提高视频加载速度 ...

  7. 爬虫案例:利用python爬虫关键词批量下载高清大图

    环境: python3+pycharm+requests+re+BeatifulSoup+json 这个确实也属实有一些勉强,不少童鞋私信问我有木有 下载大图 的源码,我说可能会有,现在分享给大家. ...

  8. 利用python爬虫关键词批量下载高清大图!

    前言 在上一篇 写文章没高质量配图?python爬虫绕过限制一键搜索下载图虫创意图片 !中,我们在未登录的情况下实现了图虫创意 无水印高清小图 的批量下载.虽然小图能够在一些移动端可能展示的还行,但是 ...

  9. Python爬虫实战批量下载高清美女图片,男生最爱的案例吧!

    彼岸图网站里有大量的高清图片素材和壁纸,并且可以免费下载,读者也可以根据自己需要爬取其他类型图片,方法是类似的,本文通过python爬虫批量下载网站里的高清美女图片,熟悉python写爬虫的基本方法: ...

最新文章

  1. 2020年总结以及21年规划
  2. tf里面InteractivateSession()与Session()的区别
  3. linux tasklet函数,14.9.5 实例:Tasklet演示
  4. Android 简单基站定位程序
  5. 中小型企业部分拓朴结构配置方法
  6. 【渝粤教育】国家开放大学2018年秋季 0692-22T化工设备机械基础 参考试题
  7. 倒序查10条数据_餐饮业总营收增量七成由外卖拉动,天眼查数据显示今年我国新增相关企业超10万家...
  8. 5月份----要做的
  9. php作业制作htm,PHP作业-HTML-2020-09-28
  10. python廖雪峰教程 学习笔记
  11. c语言编写程序统计某给定ascii文件中个字母的出现频率,2016年浙江理工大学理学院C语言程序设计考研复试题库...
  12. VS 201x C++ 编译错误解决方法集
  13. 微信iOS 8.0.8正式版重磅更新啦,这些新功能超好用!!
  14. 社区发现算法——(Spectral Clustering)谱聚类算法
  15. 未找到类型或命名空间名称 (是否缺少 using 指令或程序集引用?)
  16. 查找中位数(分治策略)
  17. 2021年职业院校技能大赛“网络安全”项目江西省A模块
  18. 2020全国普通高校大学生竞赛排行榜出炉!
  19. 面试经历|为即将找工作的你保驾护航
  20. Google首页电吉他源代码下载

热门文章

  1. 在webpack中使用vue的准备
  2. poiexcel 读取引用列_java用poi读取Excel表格中的数据
  3. Android公告栏的几种实现方式与优缺点
  4. SAP PS模块的预算管理
  5. 阿里巴巴大神发布的Java零基础笔记,实战教程多到手软,跪了
  6. 大可乐android 4.3刷机包,国产Android 4.2:
  7. pdf转换成ppt转换器
  8. sts html自动提醒,STS、Eclipse中编写java、html、javascript文件的自动提示设置 html标签属性提示 总结...
  9. AI智能视频技术如何应用在文物古迹建筑日常养护监管场景中?
  10. 手机中丢失了数据怎么办