对于爬虫来说,没有道德(比如,某些爬虫上w的并发,那么,一些小站可能就会崩溃,其实爬虫也是可以作为网络攻击的,假设有需要攻击的网站,上w甚至上百万的并发爬虫持续攻击,这个网站可能开不了),没有知识产权(爬虫行为本来就是无视知识产权的,例如,爬取特权类视频,音乐,文章),没有网站安全这些规则(通常,爬虫一旦开始,除非快速的自动封禁,例如,封IP,否则无法停止),也就是说,对于任何资源都可以借助爬虫来获取,爬虫只是一个么得感情的机器,但有些东西是不能看,不能摸的,例如,国家机密,个人隐私(那有的人说,我看看怎么了?确实没什么,但是只要让人发现了,那么牢门基本也就开了,所以有人说Python是面向牢狱编程,其实说的也就是Python里的爬虫技术)
因此,爬虫是一个需要比较全面的技术的,需要对于网站,网站结构,网站的规则,网站加解密,数据清理(爬取的数据可能会有冗余的东西在里面),正则表达式,js编程和加解密 等等非常熟悉才可以(技术全面才可以万物皆可爬,否则爬取的范围会比较狭窄)。
注:爬虫的爬取对象简单分类
根据对象的种类来说,通常可以简单分为音视频类和文字信息类,例如,爬取某个网站的音视频,这个和爬取58的租房信息(文字信息类)是截然不同的。主要是音视频基本是不需要太多数据清理的,爬取的成果基本是可以直接使用的。而文字信息类需要做大量的清洗工作,比如,爬取某个招聘网站的招聘信息,可能还需要将爬取结果分析后图形化展示,而不是简单的仅仅把招聘信息爬取下来就完了。
OK,以上是对爬虫的一个简单介绍,可能会有些地方写的不对,不过这些不是关键,关键的是本文将结合实际案例来讲解如何爬取某个视频网站,并将爬取下来的ts格式的文件碎片合并成一个可用的视频。
一,爬取流程介绍1,观察网站结构
例如,网站的资源是flv,还是ts,还是mp4,还是mpeg?data?AVI?rm?
2,判断资源存放情况,是否有加密
基本上9成的音视频是使用js技术加密
3,Python爬取数据(资源)
这个没什么好说的,选择合适的工具爬取就行了
4,清洗数据(资源),数据本地化存放
例如,ts格式的音视频,需要利用VLC或者FFmpeg这些工具做格式转换或者合并,通常不做格式转换。
二,
本例是爬取电影,为了减少不必要的麻烦,本文将对相关网站信息做一个隐藏
图片
OK,该网站是js加密的视频网站,至少说明了它的前端是js
图片
图片
下载下来的m3u8文件内容大体如下:
#注 m3u8是加密的索引文件,视频整个是由打散的ts文件组成,播放顺序什么的依赖于此文件内的定义。
图片
#EXT-X-KEY:METHOD=AES-128,URI="/GC9085SGN/hls/key.key 这一段表示视频是采用aes-128加密算法加密的,并且带有key,key 的存放地址是网站首页+/GC9085SGN/hls/key.key
ts文件是没有办法直接看的,因为,有key加密,如果没有加密,那么也仅仅是一个小片段而已。
OK,目前的任务就是通过m3u8这个索引文件将该文件内定义的所有ts文件(也就是视频碎片文件)爬取下来,并将所有ts文件合并,合并后的文件就是解密出来的可以直接看的视频文件了。
那么,保存有整个m3u8文件信息的就是以下链接了,也就是说获取ts文件是从这个链接开始:
图片
三,
Python编程,根据m3u8文件,爬取ts文件:
GC5498WCU是js加密的sn,这个每一个视频都是不同的,因此,代码里要和URL里的一致,总共是三个地方涉及。auth_key 是ID号,
import requests import re import os def ts_long(): headers = { "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive", "sec-ch-ua": "\" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"97\", \"Chromium\";v=\"97\"", "sec-ch-ua-mobile": "?0", "sec-ch-ua-platform": "\"Windows\"", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "cross-site", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36" } url = 'https://xxxxx/GC5498WCU/hls/index.m3u8?auth_key=1683086690-3uw3vaj5c3kityoxiuapmegw8ywv7clg-0-259993e937aa27591a3907a3a92b07fd' resp = requests.get(url) data = resp.textprint(data) print("1111111111") print(len(data),type(data)) indexs_list = re.findall(r'/GC5498WCU/hls/(.*)', data) #indexs_key = re.findall(r'1682852153(.*?)',data) print(indexs_list,len(indexs_list)) for i in range(0, len(indexs_list)): print(i) print(indexs_list[i]) thisname = re.findall(r'.*.ts', indexs_list[i]) print(thisname,type(thisname)) name = ''.join(thisname) print(name,type(name)) uri = 'https://xxxxxxx.cn/GC5498WCU/hls/{}'.format(indexs_list[i]) print(uri)res = requests.get(uri, headers=headers) data1 = res.content f_path = '\123' with open(f_path + name, 'wb') as fp: fp.write(data1) print(name,'下载完成!!') ts_long()
图片
代码运行的样子是这样的:
图片
四,
FFmpeg合并ts文件
FFmpeg下载地址:
Builds - CODEX FFMPEG @ gyan.dev
https://www.gyan.dev/ffmpeg/builds/packages/ffmpeg-2023-04-30-git-e7c690a046-full_build.7z
图片
FFmpeg合并ts文件有两种方式,一种方式是网络,直接通过m3u8的网络地址下载合并,大体命令如下:
E:\新桌面\ffmpeg-2023-04-30-git-e7c690a046-full_build\ffmpeg-2023-04-30-git-e7c690a046-full_build\bin\ffmpeg.exe -allowed_extensions ALL -protocol_whitelist "file,http,crypto,https,tcp,tls" -i https://xxxxx.cn/GC9093CRU/hls/index.m3u8?auth_key=1683208754-gp2c9xsv9nay1wgcjwtc6xc9ifnypeyg-0-5ffb80c2f15da85c32b0a643ffb0677d E:\新桌面\xxxx\4444.mp4
大概输出是这样的:
图片
第二种方式比较麻烦,但是速度十分的快,也就是本地的ts文件合并,由于ts文件是加密的,因此,需要key.key 文件,m3u8文件,并对m3u8文件做修改(ts文件路径修改为本地路径):
(文件修改比较麻烦,不过有宏录制还算比较简单的吧,如何批量修改见我的博文:vim的宏录制和应用实例(文本编辑飞一般的感觉)_录制宏的例子_晚风_END的博客-CSDN博客)
C:\Users\adminsss\PycharmProjects\untitled\venv\ 这个路径是我的Python跑的路径,前面下载的ts文件,不知道什么原因都加了一个S,因此,还是使用宏处理掉,key.key的路径也是本地的,ts文件也是修改为本地的,由于是本地合并,因此,合并出来的文件十分清晰,没有音视不同步的情况。
#EXTM3U#EXT-X-VERSION:3#EXT-X-TARGETDURATION:8#EXT-X-PLAYLIST-TYPE:VOD#EXT-X-MEDIA-SEQUENCE:0#EXT-X-KEY:METHOD=AES-128,URI="C:\\Users\\adminsss\\Desktop\\key.key"#EXTINF:5.067,C:\Users\adminsss\PycharmProjects\untitled\venv\SvMNMI3F0.ts#EXTINF:8.333,C:\Users\adminsss\PycharmProjects\untitled\venv\S1CGCFR76.ts#EXTINF:8.333,C:\Users\adminsss\PycharmProjects\untitled\venv\SWOYtWIYD.ts#EXTINF:8.333,C:\Users\adminsss\PycharmProjects\untitled\venv\SnqD9lyW7.ts#EXTINF:8.333,。。。。略略略
然后打开cmd,输入以下命令即可:
图片
也就是
ffmpeg.exe -allowed_extensions ALL -protocol_whitelist "file,http,crypto,https,tcp,tls" -i index.m3u8 -c copy 12323.mp4
上面的例子里,我都是用的绝对路径,m3u8 文件存放在桌面了,-allowed_extensions ALL -protocol_whitelist "file,http,crypto,https,tcp,tls" 这些必须要有,否则会报错,成功合并的样子:
图片
由于cmd是在system32目录下,因此,合并出来的文件也在这个目录下,当然,你可以指定输出的路径,我偷懒了而已。
OK,ts文件合并就暂时介绍到这里。
笔记摘录原址:https://blog.csdn.net/alwaysbefine/article/details/130477778
ffpmeg合并命令实际操作笔记:
ffmpeg.exe -allowed_extensions ALL -protocol_whitelist "file,http,crypto,https,tcp,tls" -i m3u8 文件所在路径\index.m3u8 -c copy 合并后音视频文件保存路径\12323.mp4
如果ffmpeg.exe所在bin目录在环境变量中有设置,执行时可以省去填写路径
如果m3u8文件不在桌面,执行时可以指定文件所在路径
执行合并后的文件也可以指定路径保存
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。