V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Soar360
V2EX  ›  JavaScript

写了一个慕课网视频批量下载脚本生成脚本

  •  8
     
  •   Soar360 · 2015-10-09 18:15:49 +08:00 · 14179 次点击
    这是一个创建于 3094 天前的主题,其中的信息可能已经有所发展或是发生改变。

    标题是不是很绕……
    其实就是一段 Javascript 代码,用来生成批量下载视频的 shell 代码。

    首先进入教程学习页面,比如这个: http://www.imooc.com/learn/514

    然后 F12 打开控制台( Chrome 浏览器),把写好的脚本粘贴执行。

    执行完毕后,再输入:“ document.cmd ”就可以拿到下载命令了。直接 shell 执行或者在 Windows 下搞一个 wget 放在同级目录即可。

    脚本如下:

    (function () {
        document.cmd = '';
        var dic = {};
        function getJsonCallback(json) {
            var result = json.data.result;
            var data = { name: result.name, id: result.mid, url: result.mpath[0] };
            var cmd = 'wget -O "' + dic[data.id] + " - " + data.name + '.mp4" ' + data.url;
            console.log(cmd);
            document.cmd += cmd;
            document.cmd += '\r\n';
        }
    
        var index = 1;
        $('.J-media-item').each(function () {
            var url = $(this).attr('href');
            var id = url.split('/')[2];
            var jsonPath = "http://www.imooc.com/course/ajaxmediainfo/?mid=" + id + "&mode=flash";
            dic[id] = index;
            $.getJSON(jsonPath, getJsonCallback);
            index++;
        });
    })();
    
    第 1 条附言  ·  2015-10-10 18:32:44 +08:00

    2015 年 10 月 10 日:修正错误下载练习题的问题,感谢 @hronro 的反馈。

    (function () {
        document.cmd = '';
        var dic = {};
        function getJsonCallback(json) {
            var result = json.data.result;
            var data = { name: result.name, id: result.mid, url: result.mpath[0] };
            var cmd = 'wget -O "' + dic[data.id] + " - " + data.name + '.mp4" ' + data.url;
            console.log(cmd);
            document.cmd += cmd;
            document.cmd += '\r\n';
        }
    
        var index = 1;
        $('.J-media-item').each(function () {
            var url = $(this).attr('href');
            var data = url.split('/');
            var type = data[1];
            var id = data[2];
            if(type != 'video'){
                return;
            }
    
            var jsonPath = "http://www.imooc.com/course/ajaxmediainfo/?mid=" + id + "&mode=flash";
            dic[id] = index;
            $.getJSON(jsonPath, getJsonCallback);
            index++;
        });
    })();
    
    48 条回复    2017-04-22 23:37:08 +08:00
    z742364692
        1
    z742364692  
       2015-10-09 19:18:39 +08:00 via Android
    这个必须赞,电脑上就是不能下载,麻烦
    overlords
        2
    overlords  
       2015-10-09 20:30:18 +08:00   ❤️ 1
    都已经免费了 就不要这样子搞么 投资人看到不好啊。
    Soar360
        3
    Soar360  
    OP
       2015-10-09 20:40:54 +08:00   ❤️ 1
    @overlords 还是需要搞一下,方便离线看。
    uxstone
        4
    uxstone  
       2015-10-09 20:43:32 +08:00
    慕课网靠什么赚钱?

    网易云课堂是含金钥匙出生的
    极客学院有 VIP 机制,
    慕课网全免费,靠什么盈利?
    ksupertu
        5
    ksupertu  
       2015-10-09 20:48:48 +08:00
    @uxstone 教育部开过一个互联网+下一代教育大会
    Soar360
        6
    Soar360  
    OP
       2015-10-09 20:49:57 +08:00
    @uxstone
    有啊、可以帮助推广开发组件啊。比如阿里云、测试平台什么的。
    lxjsmdc
        7
    lxjsmdc  
       2015-10-09 21:34:37 +08:00
    正好下载了在跑步机上看
    iamcho
        8
    iamcho  
       2015-10-09 22:23:53 +08:00
    赞一个
    Dsljlbaby
        9
    Dsljlbaby  
       2015-10-09 22:30:00 +08:00 via Android
    顶一个
    dadaboy
        10
    dadaboy  
       2015-10-09 22:31:31 +08:00
    Like.
    lxjsmdc
        11
    lxjsmdc  
       2015-10-09 22:56:59 +08:00   ❤️ 1
    @Soar360 导出的顺序是乱序的 求改成按顺序从 1 开始的
    Soar360
        12
    Soar360  
    OP
       2015-10-09 23:05:28 +08:00
    @lxjsmdc 下载的顺序是乱的,但是下载完后,观看是就是对得了。
    kappa
        13
    kappa  
       2015-10-09 23:09:51 +08:00
    前端不熟悉,博览网 boolan.com 有办法搞定吗?
    lxjsmdc
        14
    lxjsmdc  
       2015-10-09 23:10:13 +08:00
    @Soar360 最近正在学 JS 很奇怪这例子。获取到的是按顺序的,怎么打印输出顺序就不对了了,望赐教。


    还有,有什么方法,例如迅雷或者百度云等云空间,批量导入的同时支持自定义文件名的呢
    lxjsmdc
        15
    lxjsmdc  
       2015-10-09 23:34:28 +08:00
    @Soar360 wget -O 的值是中文会乱码 求解决方法
    badcode
        16
    badcode  
       2015-10-10 08:09:07 +08:00 via iPhone
    好吧! IDM 足矣
    wuhuaji
        17
    wuhuaji  
       2015-10-10 09:10:24 +08:00
    @lxjsmdc 我这里并没有乱码,你可以说下你的具体什么情况
    Rico
        18
    Rico  
       2015-10-10 09:17:43 +08:00
    太实用了,大赞!
    cszchen
        19
    cszchen  
       2015-10-10 09:25:19 +08:00
    做成浏览器插件会不会好一点
    Soar360
        20
    Soar360  
    OP
       2015-10-10 09:28:27 +08:00
    @cszchen 是会好一点,但是没做过……你可以试下,我毕竟不是专业搞前端的。
    del1214
        21
    del1214  
       2015-10-10 09:36:47 +08:00
    好像没有效果啊
    del1214
        22
    del1214  
       2015-10-10 09:39:24 +08:00
    用错地方了,还真好用
    Heavytiger
        23
    Heavytiger  
       2015-10-10 11:49:32 +08:00
    真心好用。 thanks very much!
    Myflos
        24
    Myflos  
       2015-10-10 12:05:51 +08:00
    大赞!要是能自动改名就更好了
    @Soar360
    Soar360
        25
    Soar360  
    OP
       2015-10-10 12:09:49 +08:00
    @Myflos
    是自动更名啊。
    Rico
        26
    Rico  
       2015-10-10 12:22:14 +08:00
    win 下把脚本放入一个 txt 文件然后

    ```
    @echo off
    for /f "tokens=*" %%i in (download.txt) do (start cmd /c %%i & ping -n 2 127.1>nul)
    pause
    ```

    保存成 bat
    就会批量下载了,wget 的多任务貌似不能同时
    nijux
        27
    nijux  
       2015-10-10 12:27:28 +08:00
    移动端都有离线功能 可以下载下来的
    zjqzxc
        28
    zjqzxc  
       2015-10-10 12:28:39 +08:00
    @Rico wget 单进程单线程,同时下载就多开几个 screen 。
    没试过能不能 axel 多线程,如果能的话其实一个一个下问题也不大。
    zjqzxc
        29
    zjqzxc  
       2015-10-10 12:45:37 +08:00
    @Rico axel -n 10 单任务已经把带宽跑满了,,不打算纠结多任务了。
    第 7 行改为: var cmd = 'axel -n 10 -o "' + dic[data.id] + " - " + data.name + '.mp4" ' + data.url;
    -n 后面的值根据总带宽除以 wget 稳定后的速度再稍微富裕几个线程
    Soar360
        30
    Soar360  
    OP
       2015-10-10 13:36:52 +08:00
    @zjqzxc 有的搞,谢谢。
    Rico
        31
    Rico  
       2015-10-10 13:45:37 +08:00
    嗯.谢谢!
    Rico
        32
    Rico  
       2015-10-10 13:46:05 +08:00
    @zjqzxc 嗯,谢谢
    intsilence
        33
    intsilence  
       2015-10-10 14:33:26 +08:00
    很实用,感谢。
    M4ster
        34
    M4ster  
       2015-10-10 14:50:04 +08:00
    用 Node.js 写了个 imooc 小爬虫
    https://github.com/monkeym4ster/imooc_crawler
    bozong
        35
    bozong  
       2015-10-10 14:55:52 +08:00
    @M4ster 666666
    M4ster
        36
    M4ster  
       2015-10-10 15:49:40 +08:00
    Screenshot:
    hronro
        37
    hronro  
       2015-10-10 15:52:21 +08:00
    有个小 bug ,有的章节可能是练习题,但是还是把它解析成 MP4 了
    Soar360
        38
    Soar360  
    OP
       2015-10-10 16:16:51 +08:00
    @hronro 能给个链接吗?
    fishlee
        39
    fishlee  
       2015-10-10 17:22:19 +08:00 via Android
    谢谢,先拿去了
    angusun
        40
    angusun  
       2015-10-10 17:31:43 +08:00
    mark
    hronro
        41
    hronro  
       2015-10-10 18:02:21 +08:00
    @Soar360 嗯,找了个这种情况特别多的:
    http://www.imooc.com/learn/141
    https://ooo.0o0.ooo/2015/10/10/5618e212e3c6d.png
    Soar360
        42
    Soar360  
    OP
       2015-10-10 18:32:58 +08:00
    @hronro 搞定了,谢谢。
    mgcnrx11
        43
    mgcnrx11  
       2015-10-11 10:54:30 +08:00
    报告一下:使用 @M4ster 的 coffee 脚本在下载 337 课程的时候抱错,貌似是解析的问题
    M4ster
        44
    M4ster  
       2015-10-11 12:02:20 +08:00
    @mgcnrx11 感谢反馈。已对文件名进行特殊符号替换为下划线处理 ;-)
    LSkyler
        45
    LSkyler  
       2015-10-14 20:12:10 +08:00
    太实用了,大赞!o.
    fhefh
        46
    fhefh  
       2015-12-04 13:04:16 +08:00
    正好有要下载的教程 嘿嘿
    zb3040
        47
    zb3040  
       2017-04-21 13:55:03 +08:00
    请教楼主现在这个脚本还在更新吗? http://www.imooc.com/learn/822 ,这个视频用着段脚本获取不到 url
    Soar360
        48
    Soar360  
    OP
       2017-04-22 23:37:08 +08:00
    @zb3040 已经被封杀了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2887 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:24 · PVG 19:24 · LAX 04:24 · JFK 07:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.