JamesHoi 发表于 2020-3-22 22:09

[Python][爬虫]网易公开课下载器,支持多线程,可分别下载视频及字幕

本帖最后由 JamesHoi 于 2020-3-23 11:33 编辑

# 前言
网上一直都找不到网易公开课的下载工具。哎,那不如自己写一个。
我这个工具只能提取易公开课的视频,不能提取网易云课堂
1. 实现了多线程功能
2. 实现了提取字幕功能
3. 实现了选择画质功能
4. 实现了下载已合成字幕视频功能
5. 添加了分集下载功能

# 原理
## 提取网站内容
在浏览器内的开发者工具的Console内输入`__NUXT__.state.movie.moiveList`可获取影片列表
![](https://s1.ax1x.com/2020/03/22/8I0xGF.png)

index:视频列表索引
`__NUXT__.state.movie.moiveList`视频列表
`__NUXT__.state.movie.moiveList.title`视频名称
`__NUXT__.state.movie.moiveList.mp4SdUrl`标清视频链接
`__NUXT__.state.movie.moiveList.mp4HdUrl`高清视频链接
`__NUXT__.state.movie.moiveList.mp4ShdUrl`超清视频链接
`__NUXT__.state.movie.moiveList.mp4ShareUrl`手机观看视频链接(包含字幕)

`__NUXT__.state.movie.moiveList.subList`字幕列表
`__NUXT__.state.movie.moiveList.subList.subName`字幕语言
`__NUXT__.state.movie.moiveList.subList.subUrl`字幕链接

然后用Python的Selenium模块通过运行js脚本提取
`data = driver.execute_script("return <__NUXT__命令>")`

## 下载模块
用requests模块可以实现
```python
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)
```
[参考链接](https://www.cnblogs.com/sea-stream/p/11082356.html)

# 软件使用教程
![](https://s1.ax1x.com/2020/03/22/8I1cB4.png)
可通过以下几种方式下载

## 方法一.通过新版课程链接进行下载
![](https://s1.ax1x.com/2020/03/22/8InIc4.png)
[范例网页](http://open.163.com/newview/movie/courseintro?newurl=%2Fspecial%2Fopencourse%2Fthought.html)

## 方法二.通过旧版课程链接进行下载
![](https://s1.ax1x.com/2020/03/22/8IQHxO.png)
[范例网页](http://open.163.com/special/sp/thought.html)

## 方法三.通过视频链接进行下载
![](https://s1.ax1x.com/2020/03/22/8I1Qht.png)
[范例网页](http://open.163.com/newview/movie/free?pid=M8KB8VE0G&mid=M8KBDR4UL)

## 下载选项
1. 可选择多少个视频同时下载(线程个数)
2. 可选择字幕和影片是否分开
3. 可选择视频画质(如果原视频可以选择)
4. 可分集下载,用逗号隔开
例如一共有11集,不需要下载第2集和第6集,填1,3-5,7-11
下载全部填all,下载当前视频填origin
若填写课程链接默认下载全部,视频链接默认下载当前视频

# 效果


家里是100M宽带,经过测试基本能达到满速

# 项目源码
(https://github.com/JamesHoi/Open163-Downloader)

# 软件下载
(https://github.com/JamesHoi/Open163-Downloader/releases)
[微云下载](https://share.weiyun.com/5CZQoVH)
喜欢的话多给Github项目star和点评吧!!

JamesHoi 发表于 2020-3-22 22:48

本帖最后由 JamesHoi 于 2020-3-22 23:16 编辑

taozididi 发表于 2020-3-22 22:46
收费能不能我已经写好的软件不支持拿收费的视频,但若能打开视频网页(试看的我试过可以,付费的不知道),在浏览器的开发者工具的Console里面输入document.getElementsByTagName("video").vjs_video_3_html5_api.src
然后命令行会返回当前网页视频链接


假如要拿字幕,开发者工具->Network,选XHR。找到vvt文件,将vvt链接后缀改为.srt即为字幕链接

例如vvt链接为http://nos.netease.com/oc-caption-srt/oc-srt-1370689238514.vvt
则srt链接为http://nos.netease.com/oc-caption-srt/oc-srt-1370689238514.srt

JamesHoi 发表于 2020-3-23 11:38

本帖最后由 JamesHoi 于 2020-4-14 15:14 编辑

破风 发表于 2020-3-23 10:39
有网易云课堂的吗
(我是因为网上找不到网易公开课的我才自己写了一个)
除了网易公开课,其他的例如 中国大学MOOC、学堂在线、网易云课堂、好大学在线、爱课程 MOOC 课程,建议用这个
网址:https://mooc.xoy.io/#/specific/study-163-mooc

JamesHoi 发表于 2020-6-13 23:03

85502992 发表于 2020-6-13 18:28
复制不进去,不知道为什么,我的系统是win7的

右键cmd,选择 "属性" -> "选项" -> "编辑选项" -> 把快速编辑模式勾选上,如下图:

参考一下这个:
https://blog.csdn.net/ricky_yangrui/article/details/81941299
https://jingyan.baidu.com/article/1876c852bcab82890b13768f.html

decade10 发表于 2020-3-22 22:27

明天试试,优秀哦

taozididi 发表于 2020-3-22 22:46

{:301_977:}收费能不能

sushaka 发表于 2020-3-22 22:50

谢谢楼主分享

ciker_li 发表于 2020-3-22 22:57

有收费的就厉害了

efujin 发表于 2020-3-22 23:02

mark,手机已阅,明天PC尝试下

天高云淡945 发表于 2020-3-22 23:06

感谢分享

esky1981 发表于 2020-3-22 23:15

非常感谢,谢谢分享!

Parkourr 发表于 2020-3-23 00:08

秀秀,大佬分享感谢感谢
页: [1] 2 3
查看完整版本: [Python][爬虫]网易公开课下载器,支持多线程,可分别下载视频及字幕