本帖最后由 JamesHoi 于 2020-3-23 11:33 编辑
前言
网上一直都找不到网易公开课的下载工具。哎,那不如自己写一个。
我这个工具只能提取易公开课的视频,不能提取网易云课堂
- 实现了多线程功能
- 实现了提取字幕功能
- 实现了选择画质功能
- 实现了下载已合成字幕视频功能
- 添加了分集下载功能
原理
提取网站内容
在浏览器内的开发者工具的Console内输入__NUXT__.state.movie.moiveList 可获取影片列表
index:视频列表索引
__NUXT__.state.movie.moiveList 视频列表
__NUXT__.state.movie.moiveList[index].title 视频名称
__NUXT__.state.movie.moiveList[index].mp4SdUrl 标清视频链接
__NUXT__.state.movie.moiveList[index].mp4HdUrl 高清视频链接
__NUXT__.state.movie.moiveList[index].mp4ShdUrl 超清视频链接
__NUXT__.state.movie.moiveList[index].mp4ShareUrl 手机观看视频链接(包含字幕)
__NUXT__.state.movie.moiveList[index].subList 字幕列表
__NUXT__.state.movie.moiveList[index].subList[inx].subName 字幕语言
__NUXT__.state.movie.moiveList[index].subList[inx].subUrl 字幕链接
然后用Python的Selenium模块通过运行js脚本提取
data = driver.execute_script("return <__NUXT__命令>")
下载模块
用requests模块可以实现
import requests
import time
def downloadFile(url,path, name):
r = requests.get(url, stream=True,verify=False)
length = float(r.headers['content-length'])
f = open(path+name, 'wb')
count = 0
count_tmp = 0
time1 = time.time()
for chunk in r.iter_content(chunk_size=512):
if chunk:
f.write(chunk)
count += len(chunk)
if time.time() - time1 > 2:
p = count / length * 100
speed = (count - count_tmp) / 1024 / 1024 / 2
count_tmp = count
print(name + ': ' + formatFloat(p) + '%' + ' Speed: ' + formatFloat(speed) + 'M/S')
time1 = time.time()
f.close()
def formatFloat(num):
return '{:.2f}'.format(num)
参考链接
软件使用教程
可通过以下几种方式下载
方法一.通过新版课程链接进行下载
范例网页
方法二.通过旧版课程链接进行下载
范例网页
方法三.通过视频链接进行下载
范例网页
下载选项
- 可选择多少个视频同时下载(线程个数)
- 可选择字幕和影片是否分开
- 可选择视频画质(如果原视频可以选择)
- 可分集下载,用逗号隔开
例如一共有11集,不需要下载第2集和第6集,填1,3-5,7-11
下载全部填all,下载当前视频填origin
若填写课程链接默认下载全部,视频链接默认下载当前视频
效果
家里是100M宽带,经过测试基本能达到满速
项目源码
Github项目
软件下载
Github发布页
微云下载
喜欢的话多给Github项目star和点评吧!! |