视频演示:https://v.qq.com/x/page/s3074becqg7.html
本文可能是一师一课视频的下载和合并方法的首发。大体思路是先使用油猴插件,抓取到标题和视频列表地址,再在python中逐一下载列表中的视频片段并合并成一个文件,最后删除视频片段。具体流程如下:
1.添加油猴脚本
// ==UserScript==
// @name 1s1k
// @namespace http://oyfdkz.com/
// @version 0.1
// @description try to take over the world!
// @author QQ 5432012
// @match http://1s1k.eduyun.cn/*
// @grant 123456
// ==/UserScript==
(function() {
//进入页面后每500毫秒重复执行
var t1 = window.setInterval(hello,500);
function hello(){
//试图抓取视频播放器中列表地址
var ls=player.getPlaylist();
var fn=ls[0].file;
if(fn.indexOf('.m3u8')!=-1){
//抓到地址,退出循环,弹出标题和地址
window.clearInterval(t1);
var tt = document.getElementsByTagName('h1')[0].innerHTML;
tt.replace(/[<>:"/|?*]+/g, '');
alert(tt+'|'+fn);
}
}
})();
设置用户包括,在访问1s1k.eduyun.cn时触发脚本
2.抓取标题和视频地址
访问具体的一课页面后,油猴脚本生效,弹出标题和视频列表地址,将文本复制下来。
3.python中下载合并
import urllib.request
import requests
from requests.adapters import HTTPAdapter
import time
import re
import os
while True:
#读取标题和地址
geturl=input('输入地址:')
url=geturl.split('|')[1]
#读取视频列表
website = urllib.request.urlopen(url,timeout = 1000)
html = website.read()
html=html.decode('utf-8','ignore')
line=html.split('\n')
#片段总数
tstr=line[len(line)-3].split('.')
tstr=tstr[len(tstr)-2]
tstr=int(tstr)+1
#标题处理
path_data=geturl.split('|')[0]
rstr = r"[\/\\\:\*\?\"\<\>\|]" # '/ \ : * ? " < > |'
path_data = re.sub(rstr, "_", path_data) # 替换为下划
#临时目录清空
if os.path.exists(path_data):
del_list = os.listdir(path_data)
for i in del_list:
file_data = path_data + "/" + i
if os.path.isfile(file_data) == True:
os.remove(file_data)
else:
del_file(file_data)
os.mkdir(path_data)
#依次下载片段
for i in range(tstr):
s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=12))
try:
fc=s.get(url+'.' +str(i)+ '.ts', timeout=(5,300))
print(str(i), end = ' ')
with open(path_data+'/'+str(i)+'.ts','wb') as f:
f.write(fc.content)
f.close
except:
print(str(i) +"超时放弃.............")
#合并片段
fname = open(path_data+'.mp4','wb')
print('')
for i in range(tstr):
x=open(path_data+'/'+str(i)+'.ts','rb')
fname.write(x.read())
x.close
fname.close()
x=open('tmp','r')
x.close
#删除片段
del_list = os.listdir(path_data)
for i in del_list:
file_data = path_data + "/" + i
try:
os.remove(file_data)
except:
print(file_data +' del err')
try:
os.rmdir(path_data)
except:
print('', end = '')
print(path_data+" is ok!")
print('');
运行python脚本,粘贴刚才复制的地址
一师一课一节课的视频被压缩到200兆左右,画质损失严重。下载的方式要比录屏效率更高,损失更小。初学python,代码粗陋,仅供参考。
土豪用户直接下载代码:https://download.csdn.net/download/nokiae50/12202653