需求:有时看到网上的视频并不是引用mp4链接播放的,而是src=’'blob:xxx"这种引用,无法直接用爬虫直接爬取
<video ... src="blob:https://www.finger66.com/4b1aa32e-602c-4211-a557-87f7adccdb5e"></video>
分析真实的资源:F12打开调试工具,点击播放并查看NetWork下访问的链接,会发现有个会访问xxx.m3u8的m3u8文件格式的地址,以及在播放的过程中会陆续访问xxx.ts,而xxx.m3u8接口返回的就是ts文件参数列表,ts文件就是m3u8格式的视频资源分片(每个ts文件可以单独用播放器播放),网页播放的内容就是按照顺序从ts读取的,而这些ts文件可以通过合成变为一个完整的视频资源
爬取资源思路:
1.先找到*.m3u8接口,并爬取里面的ts文件参数列表
2.通过*.ts链接下载所有ts文件到本地
3.调用ffmpeg将本地的ts文件合成mp4文件
本次测试的环境配置
系统: mac OS
爬虫语言:python
视频处理工具:ffmpeg (可以直接通过命令brew install ffmpeg安装)
关键代码
下载ts文件到本地
#视频页面vedioSRC = 'https://www.finger66.com/mobile/post/5109165?channel=wechatSession&from=singlemessage&isappinstalled=0'
#放置ts文件所在目录
tsPath = "mp4/"
#获取ts文件参数
hostname = 'https://media.finger66.com'
tsParamUrl = hostname + '/posts/84222300000/MTU1NjEwNDU0ODI2Nw==.mp4.m3u8'
import urllib.request
tsParamData = urllib.request.urlopen(tsParamUrl).read().decode('utf-8')
# print(tsParamData)
import re
pat = '/(.*?).ts'
tsParamArr = re.compile(pat).findall(tsParamData)
#爬取ts文件到本地
for n in range(0,len(tsParamArr)):
strArr = tsParamArr[n].split('/')
localTSFileName = strArr[len(strArr)-1]+'.ts'
tsLink = hostname + '/' + tsParamArr[n] + '.ts'
urllib.request.urlretrieve(tsLink, tsPath+localTSFileName )
# print(tsLink)
将下载到本地的ts文件合成mp4文件
import os
#获取所有的ts文件
path_list = os.listdir(tsPath)
#对文件进行排序并将排序后的ts文件路径放入列表中
path_list.sort()
li = [os.path.join(tsPath,filename) for filename in path_list]
#将ts路径并合成一个字符参数
tsfiles = '|'.join(li)
#print(tsfiles)
#指定输出文件名称
saveMp4file = tsPath + 'target.mp4'
#调取系统命令使用ffmpeg将ts合成mp4文件
cmd = 'ffmpeg -i "concat:%s" -acodec copy -vcodec copy -absf aac_adtstoasc %s'% (tsfiles,saveMp4file)
os.system(cmd)
完整代码:
在mac上将上面两段代码合二为一就可以成功运行
源码下载地址https://download.csdn.net/download/jo_andy/11192083