蒟蒻声明
这个程序虽然可以差强人意地实现功能但是烂的一批,也不打算做出较大改动了。后面会总结一些不足之处,以警示以后。
思路
。
1.
通过抓包发现云班课的视频时m3u8的,即一个m3u8的文件中记录了数个ts类型视频的链接,这些ts视频的时常一般为10秒。想爬取某个视频只需要获取视频对应的m3u8文件,依次把m3u8文件中的ts文件下载并通过os.system()调用命令行把一系列的ts文件合并为mp4
2.
步骤1是单独下载一个视频的思路,若想下载所有视频,只需要找出所有视频的m3u8,重复步骤1。
单独下载一个m3u8
笔者仅仅在要爬的课程中实验该程序可以达到目的,至于其他的m3u8就不清楚了
1.
获取m3u8文件后解析其内容,做到可以提取出所有的ts文件链接
2.
把所有的ts文件下载本地的同一个文件夹中
3.
调用命令行,例如这样:
os.system(‘copy /b ‘+os.path.abspath(tempworkpath)+’\.ts ‘+os.path.abspath(pathOUTPUT)+’\’+nameOUTPUT+’.mp4’)
合并所有ts文件为一个新的mp4文件
4.
把这一次下载的ts文件删掉,以备下一次操作
os.system('del ‘+os.path.abspath(tempworkpath)+’\.ts’)
import re
import requests
from bs4 import BeautifulSoup
import os
def DownOne(url,name):
toIdxStr = lambda x : ('000000000'+str(x))[-10:]
urlM3U8 = url
nameOUTPUT = name.replace(' ','')
pathOUTPUT = 'out'
sch = re.search('(.+?/[0-9].{3}/[0-9].{1}/[0-9].{1}/)(.+?).m3u8',urlM3U8)
headM3U8 = sch.group(1)
nameM3U8 =sch.group(2)
tempworkpath = 'aaabbbcccdddeeefffggghhhiii'
resM3U8 = requests.get(urlM3U8)
lstTS = re.findall('.+?ts',resM3U8.text)
if not os.path.exists(tempworkpath):
os.mkdir(tempworkpath)
if not os.path.exists(pathOUTPUT):
os.mkdir(pathOUTPUT)
for i,each in enumerate(lstTS):
print(i,'of',len(lstTS))
res = requests.get(headM3U8+each)
with open(tempworkpath+'/'+nameM3U8+toIdxStr(i)+'.ts', 'wb') as f:
f.write(res.content)
print('合并')
print('copy /b '+os.path.abspath(tempworkpath)+'\\*.ts '+os.path.abspath(pathOUTPUT)+'\\'+nameOUTPUT+'.mp4')
os.system('copy /b '+os.path.abspath(tempworkpath)+'\\*.ts '+os.path.abspath(pathOUTPUT)+'\\'+nameOUTPUT