关于blob加密视频的基于m3u8和ts文件下载转MP4视频的python爬虫实现

首先谈一下这篇文章主要的爬虫对象,基本上都是一些视频网站(一些大厂会有自己独特的编码风格需要自行破解加密格式,所以很难实现,所以这篇文章主要针对于一些小网站)。

下面先说一下blob加密的实现,可以参考这篇博客(https://blog.csdn.net/xingyun89114/article/details/80699527)

总结来说呢,其实就是HTTP请求后的数据做blob加密,上篇博客我们也可以在开发者模式中的network部分找到相关m3u8文件以及ts文件,在这里先提一句,那就是有一些网站呢,你已经开始播放后,再打开开发者模式去找这些文件的时候,可能你只能找到ts文件,你需要刷新网页先开开发者模式,再进行后续操作。

下面开始简述基本流程

首先你需要找到m3u8文件,其次你需要解析出所有的ts文件的路径,这个解析的过程是因为大部分m3u8文件的里面给出的ts文件是相对路径,最后通过命令行将所有ts文件拼接成MP4文件。

理论成立,实践开始!

首先呢,我们做的工作是半自动化,手动下载你所需要的m3u8文件,就是在开发者模式中找到该文件,通过其url进行下载,下面给出一段关于解析m3u8文件到ts文件的代码片段。

def get_ts_urls(path_m3u8, filename, base_url):# 将index.m3u8文件解读为数组print('-' * 70)print('Analysising M3U8 File...')urls = []with open(path_m3u8 + filename,"r") as file:lines = file.readlines()for line in lines:if line.endswith(".ts\n"):urls.append(base_url+ line.strip("\n"))if(len(urls) > 0):print('-' * 70)return urls

这样我们便得到了一个关于所有ts文件的url的list。

其次的工作呢,是将这些url中的ts文件下载到本地
我利用的是urllib,给出相关代码如下:
(后续会对其进行加工)

   urlretrieve(url, filename)

之后是通过命令行来将所有的ts文件转为一个MP4文件

copy /b *.ts video.mp4

这样一个最low最low的版本就实现了,下面我们根据上述方法存在的问题进行改良。

首先是关于urlretrieve方面,很多情况下,我们会发现由于网络原因等,一个ts文件的下载会很慢甚至会失败,经常会抛出这样的异常(urllib.error.URLError: urlopen error _ssl.c:1039: The handshake operation timed out)针对于这种情况,我们改良这个方法,可以进行多次尝试,而且为每次尝试设置timeout。(这个是在某篇博客看到的,但是当时没保存url,现在找不到该博客,不是有意抄袭

def OwnUrlRetrieve(url, filename, timeout):# 改良的urlretrieve方法,主要是因为有的网站会超时,如果说ts下载速度特别慢而且经常超时可以先修改时间限制,不行就放弃吧(估计有IP的防爬)socket.setdefaulttimeout(timeout)try:urlretrieve(url, filename)except socket.timeout:count = 1while count <= 5:try:urlretrieve(url, filename)breakexcept socket.timeout:err_info = 'Reloading for %d time' % count if count == 1 else 'Reloading for %d times' % countprint(err_info)count += 1if count > 5:print("download job failed!")

这样基本上会保证不会因为网络原因而中断下载任务。

其次我们将命令行部分封装到代码里,在此提示,之前的下载以及命令行等请自己注意好文件路径。

def ts2mp4(path):#cmd命令行,如果这个方法出错了,八成是管理员权限没有赋给这个文件夹,还有就是你也可以自己用命令行执行,只是为了全自动化cmd = 'copy /b *.ts video.mp4'os.chdir(path)os.system(cmd)

下面我们可能还是感觉这不是很智能,而且没有应用于爬虫。

我们的目标:给出一个url就可以获取该页视频,这才是棒棒的程序(全自动化)。

摆在我们面前的第一个问题是,给出一个url我就能找到正确的index.m3u8文件,请注意是正确的

在给出一段url之后,我们利用webdriver可以找到该网页中的视频url数据,我比较常用的可能有两个方面,第一个是通过标签检索,这个需要有一些网页开发的经验,比如说js里的document.getElementById()等等的,在我们的爬虫中是这个(driver.find_element_by_id),下面给出一篇博客,有好多这种方法(https://www.cnblogs.com/youngleesin/p/10447907.html),第二个是根据responsetext自己去找相关url,这个因为没法普遍应用于所有网页,所以就不推广了。

在进行这部分前你需要先下载好chorme驱动等相关配置,下面代码中的两个本地地址,D盘的是我浏览的exe执行文件地址,E盘的是python环境中的驱动包地址,关于这个包下载的给出一篇博客(https://blog.csdn.net/muriyue6/article/details/101440353)

下面给出相关代码

def download_m3u8(page_url, path_m3u8):print('-' * 70)print('Downloading M3U8 File...')chrome_options = Options()chrome_options.add_argument('--headless')chrome_options.add_argument('--disable-gpu')chrome_options.binary_location = r"D:\Google\Chrome\Application\chrome.exe"driver = webdriver.Chrome(executable_path=r'E:\Anaconda3\Lib\site-packages\selenium\webdriver\chrome\chromedriver.exe',options=chrome_options)driver.get(page_url)frame = driver.find_element_by_id("")#这没写是为了不侵权,狗头保命#这句就是精髓,找到对应的iframe从而找到index.m3u8的地址,这个需要根据网页来定,方法不一定根据id,你有网页开发经验的话就很好理解m3u8_url = frame.get_attribute('src').split('?')[1].split('&')[0].split('=')[1]#这句话也是你要拆好这个参数OwnUrlRetrieve(m3u8_url, path_m3u8, 20)driver.quit()time.sleep(1)#防止本机卡的一些故障print('-' * 70)return 'https://' + m3u8_url.split('/')[2]

好了,到这里我们的主要功能都说完了,下面有几个小tips要提出

第一个坑,我在刚才说的时候提到的正确的m3u8文件,有很多网站呢,他很坏,有不止一个m3u8文件,可能是两个,而第一个文件经常会被我们所找到,但是这个文件不包含ts文件信息,而是第二个文件的相对路径,所以我们找到第一个文件之后,不需要再去遍历整个网页去找第二个文件,而是改写我们之前的方法,有一些聪明的小伙伴可能发现我上面的一段代码只写了if,下面给出全代码。

def get_ts_urls(path_m3u8, filename, base_url):# 将index.m3u8文件解读为数组print('-' * 70)print('Analysising M3U8 File...')urls = []with open(path_m3u8 + filename,"r") as file:lines = file.readlines()for line in lines:if line.endswith(".ts\n"):urls.append(base_url+ line.strip("\n"))if(len(urls) > 0):print('-' * 70)return urlselse:with open(path_m3u8 + filename, "r") as file:lines = file.readlines()for line in lines:if line.endswith(".m3u8"):urls.append(relative_path(base_url) + line)if(len(urls) == 1):OwnUrlRetrieve(urls[0], path_m3u8 + filename,20)base_url = urls[0]results = get_ts_urls(path_m3u8,base_url)return resultselse:urls[0] = 'error'return urls

第二个算是一个小建议,当我们需要下载多集资源的时候,我们可以通过更改url的方式来使得程序更智能化。

第三个呢,就是有一个可以改进的地方,那就是可不可以用多线程来实现ts文件的下载,这样可以加速我们的ts文件下载。之前的urls的list其实就是任务池,如果有大佬写出了这样的代码,欢迎大佬联系我(neuericliu@163.com)。

最后的最后,我全部的代码做了整合之后(还有一些进度条功能)放在CSDN资源里面,希望支持,(苦逼的孩子有时候需要下训练集需要积分)
资源链接:(https://download.csdn.net/download/weixin_41084548/12209564)

关于blob加密视频的基于m3u8和ts文件下载转MP4视频的python爬虫实现相关推荐

  1. 通过python多线程下载基于m3u8和ts的视频文件

    开篇介绍 需求和使用场景 有些时候想要把在线观看的视频保存下来,或由于在线看很卡顿想离线看,但官方并没有提供下载工具,如果使用录频软件则电脑同时不能进行其他操作,而且有些电影看过一遍也不会想再看,因此 ...

  2. m3u8及TS文件下载解密:m3u8文件下载及分析(二)

    M3U8文件格式 下载下来的m3u8打开后最典型的如下图: 详细的格式比较复杂,只就上述字段进行描述: EXTM3U 开始标识.每个M3U文件第一行必须是这个. EXT-X-VERSION:3 EXT ...

  3. m3u8及TS文件下载解密:m3u8文件下载及分析(三)

    多线程下载TS文件 aria2c下载TS文件 aria2c 是一个用来下载文件的实用程序.支持HTTP(S), FTP, SFTP, BitTorrent,和Metalink协议.我们可以调用aria ...

  4. m3u8及TS文件下载解密:用FFmpeg解密合并m3u8中ts文件(二)

    关于本地文件的m3u8格式 从网站上下载的m3u8文件格式是这样的 如果想用ffmpeg文件在线处理,直接把其中的XXXXXX.ts和key.key文件替换成全路径的就可以,比如这样: 然后直接用ff ...

  5. m3u8及TS文件下载解密:如何从播放网址查找m3u8文件(一)

    用浏览器打开视频播放网址 打开浏览器,打开最终的播放页面(注意是下面带有这种带有播放窗口的页面,能够在页面上直接看到视频). 不是下面这种只有播放地址链接,看不到播放的页面 右键查看源代码 点击右键, ...

  6. m3u8及TS文件下载解密:如何从播放网址查找m3u8文件(三)

    动态网址 有些网站从源代码里面搜到的m3u8地址是js动态生成的,像这样 查看js文件是通过eval动态执行的 看代码太麻烦,这时可以通过浏览器跟踪查找变量的具体值 查找变量 F12 打开调试窗口(注 ...

  7. m3u8及TS文件下载解密:m3u8文件下载及分析(一)

    下载m3u8文件 找到m3u8的网址后,在浏览器中输入该网址,就可以自动下载m3u8文件. 用记事本打开都可以看到具体内容 M3u8跳转 有的下载的m3u8文件打开是这样的: 需要根据其中的内容获得真 ...

  8. m3u8下载ts 合并成一个视频

    我们在用网页看视频时,很多时候视频是下载不下来的,当然这里面有很多技术来防止我们下载视频,接下来我将破解使用m3u8格式来下载视频.一般情况下,我们使用浏览器中Network来查看服务器和本机的数据传 ...

  9. android windows 无线视频传输,基于Android端到端实时无线视频传输系统

    摘要: 自从Android2.3发布以来,摄像头以及底层多媒体系统的完善,为视频流媒体业务的发展奠定了良好的基础.目前开发人员利用Android提供的资源对视频业务的开展主要集中在视频播放器的功能的扩 ...

最新文章

  1. python画散点图类型-python画时间序列散点图
  2. MongoDB 增删改查
  3. linux如何卸载netstat,linux – Netstat -s显示(并且正在增长)“从接收队列中删除的数据包”和“数据包在接收队列中崩溃”...
  4. 深入理解右值引用,move语义和完美转发
  5. 本田与索尼宣布将成立合资企业 计划2025年开始销售电动汽车
  6. sudo: sorry, you must have a tty to run sudo
  7. RocketMQ 一行代码造成大量消息发送失败
  8. WPF备忘录(7)WPF图片资源路径介绍
  9. 新xp系统如何链接网络连接服务器地址,xp系统如何设置宽带连接
  10. 精灵图(雪碧图)一招解决定位难问题,再也不用猜位置或者ps测距离了
  11. 使用计算机自带的wifi,电脑的自带无线网卡你知道怎么用吗?赶紧学习一下
  12. mysql 日志文件_mysql日志文件在哪
  13. 今年48岁社保一直没有交过,现在单位要求一定要买,可是就差两年就到退休,该怎么办?
  14. Android图像适配
  15. pr导出视频在哪里?
  16. 硬盘出现故障的5种表现
  17. Access根据出生日期计算年龄_小技巧 | 在SPSS中根据出生日期计算年龄
  18. 使用pymysql连接数据库
  19. Python 如何突破反爬虫指纹 JA3
  20. c++ 75道逻辑题(面试宝典)

热门文章

  1. 【软件测试】Web测试基础(各类协议)面试必背
  2. AS5600使用简介
  3. rar命令行解压zip文件提示不是 rar 压缩文件,没有可提取的文件的解决办法
  4. linux下bowtie2安装
  5. 【HCIA-cloud】【6】服务器虚拟化之虚拟机和模板:虚拟机和模板说明、虚拟机的Tools说明、虚拟机的创建内容说明、虚拟机的关键操作说明
  6. XTU OJ 1087
  7. java内部类赋值_详解 Java 内部类
  8. 程序员拿到结婚证以后说的第一句话
  9. 流程图、顺序图、状态图他们三者分别解决什么样的问题?
  10. linux virsh console无法登入虚拟机,宿主机virsh console 登录异常