Java代码实现下载慕课网视频
来源:互联网 发布:手机淘宝优惠券在哪领 编辑:程序博客网 时间:2024/06/16 00:07
首先,必须得说,慕课网是一个非常棒的网站,上面很多很好的视频教程,在此表示感谢!
马上过年回家,因为家里没网,所以想把慕课上的视频下载下来在家里看,于是乎在网上找了半天下载工具,有的工具做的牛逼,直接给你把慕课网上全部的视频下载下来,我想说做这个软件的哥们真是缺心眼,谁疯了去下载那么多视频?于是找了一个别人写好的项目,里面有一个imoocDownloader.jar文件,和一个run.bat批处理文件,意思是要先安装好jar包,然后执行run.bat批处理文件,然后根据提示输入要下载的视频的编号,就可以开始下载了,于是乎我激动的不行,我根据提示输入要下载的视频的编号后,直接给我抛一个ArrayOutOfIndexException,我也是醉了。这东西能用吗?好在有imoocDownloader.jar包,那就好弄了。
我用了jd-gui工具将这个jar反编译拿到了java源代码,有了源代码,那就简单了,但是源代码直接运行的时候各种错误,于是我在idea下新建了一个工工程,然后把他的代码移植到了我的项目中,并通过maven管理依赖的jar包,依赖的jar有jsoup和json。项目移植完毕后,debug发现了抛出上面异常的原因,那家伙,那代码懂编程的都知道写到不对,于是对代码做了修改,并去掉了源代码中对于非视频类教程的下载,即只下载了视频类的课程。
但是还是得感谢这个兄台。
慕课网视频url格式说明
http://www.imooc.com/learn/699 这个url,你会发现,这是一个完整的关于Lavarel-表单篇的教程地址我下载我当然希望一次把这个下面的所有章节的视频全部下载了。所以main函数运行后,根据提示你可以输入699启动下载
我下载下来的原始代码里面,还可以让你对期望下载的视频类型,比如高清,超清,标清进行输入选择,我索性去掉了,我只看超清,所以给了一个默认值
好吧,本想直接把我的项目传上来,发现太大了,还是给大家写下几个主要的类吧
1. 首先是main函数类
package com.immoc.controller;import com.immoc.service.DownloadFile;import com.immoc.service.GetInput;import org.json.JSONArray;import org.json.JSONObject;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;import java.io.File;public class ImoocMain { static int curruntCount; static int curruntGlobalCount; public static void main(String[] args) throws Exception { while (true) { curruntCount = 0; curruntGlobalCount = 0; int classNo = GetInput.getInputClassNo(); Document doc = Jsoup.connect("http://www.imooc.com/learn/" + classNo).get(); String title = doc.getElementsByTag("h2").html(); Elements videos = doc.select(".video a"); if ((title.equals("")) && (videos.size() == 0)) { System.out.println("抱歉,没有该课程!\n"); } else { int count = 0; for (Element video : videos) { String[] videoNos = video.attr("href").split("/"); if (videoNos.length >= 2 && videoNos[1].equals("video")) { count++; } } System.out.print("\n要下载的课程标题为【" + title + "】,"); System.out.println("本次要下载的视频课程有 " + count + " 节\n");// int videoDef = GetInput.getInputVideoDef(); int videoDef = 0; //这里默认下载超清的 String savePath = "./download/" + title + "/"; File file = new File(savePath); file.mkdirs(); System.out.println("\n准备开始下载,请耐心等待…\n"); for (Element video : videos) { String[] videoNos = video.attr("href").split("/"); //只下载视频 if (videoNos.length > 1 && videoNos[1].equals("video")) { video.select("button").remove(); String videoName = video.text().trim(); videoName = videoName.substring(0, videoName.length() - 7).trim(); String videoNo = videoNos[2]; Document jsonDoc = Jsoup.connect( "http://www.imooc.com/course/ajaxmediainfo/?mid=" + videoNo + "&mode=flash").get(); String jsonData = jsonDoc.text(); JSONObject jsonObject = new JSONObject(jsonData); JSONArray mpath = jsonObject.optJSONObject("data") .optJSONObject("result").optJSONArray("mpath"); String downloadPath = mpath.getString(videoDef).trim(); DownloadFile.downLoadFromUrl(downloadPath, videoName + ".mp4", savePath); curruntCount += 1; System.out.println("【" + curruntCount + "】:\t" + videoName + " \t下载成功!"); } } System.out.println("\n恭喜!【" + title + "】课程的所有视频已经下载完成!!!下载的文件在该程序所在目录下的download文件夹中。\n-------------------------------------------------------\n"); } } }}
在main函数类中调用了几个其他的类
2. GetInput类,主要用于读取用户的输入
package com.immoc.service;public class GetInput { public static int getInputClassNo() { int classNo = 0; java.util.Scanner scanner = new java.util.Scanner(System.in); for (;;) { System.out.println("请输入需要下载的课程编号(如:http://www.imooc.com/learn/601,则输入601):"); try { classNo = scanner.nextInt(); break; } catch (Exception e) { System.out.println("课程编号填写错误,只能输入数字!\n"); scanner.nextLine(); } } return classNo; } public static int getInputVideoDef() { int videoDef = 0; java.util.Scanner scanner = new java.util.Scanner(System.in); for (;;) { System.out.println("请输入要下载的清晰度,【0】超清,【1】高清,【2】普清:"); try { videoDef = scanner.nextInt(); if ((videoDef <= 2) && (videoDef >= 0)) { break; } throw new Exception(); } catch (Exception e) { System.out.println("只能输入【0】【1】【2】中的一个数!\n"); scanner.nextLine(); } } return videoDef; }}
3. DownloadFile类,主要负责下载
package com.immoc.service;import java.io.ByteArrayOutputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.URL;public class DownloadFile{ public static void downLoadFromUrl(String urlStr, String fileName, String savePath) throws IOException { URL url = new URL(urlStr); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(3000); conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); InputStream inputStream = conn.getInputStream(); byte[] getData = readInputStream(inputStream); java.io.File saveDir = new java.io.File(savePath); if (!saveDir.exists()) { saveDir.mkdir(); } java.io.File file = new java.io.File(saveDir + java.io.File.separator + fileName); FileOutputStream fos = new FileOutputStream(file); fos.write(getData); if (fos != null) { fos.close(); } if (inputStream != null) { inputStream.close(); } } public static byte[] readInputStream(InputStream inputStream) throws IOException { byte[] buffer = new byte[1024]; int len = 0; ByteArrayOutputStream bos = new ByteArrayOutputStream(); while ((len = inputStream.read(buffer)) != -1) { bos.write(buffer, 0, len); } bos.close(); return bos.toByteArray(); }}
此外,你的项目里面必须引入如下两个依赖
<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.7.2</version> </dependency> <dependency> <groupId>org.json</groupId> <artifactId>json</artifactId> <version>20160212</version> </dependency>
Ok,大功告成!
- Java代码实现下载慕课网视频
- 文件下载java代码实现
- 下载图片、视频代码
- 利用java代码自动下载嗨学网的学习视频
- Python实现视频下载
- Java RMI 实现代码动态下载
- 实现文件下载的java代码
- Java RMI实现代码动态下载
- 实现文件下载的java代码
- 实现文件下载的java代码
- JAVA代码实现FTP文件下载
- JAVA代码实现SFTP文件下载
- Java代码实现FTP文件下载
- Java代码实现SFTP文件下载
- Java代码实现多线程下载和断点续传
- JAVA代码实现FTP文件下载
- 利用Java代码实现图片的下载:
- Java代码实现多线程下载和断点续传
- qml所有属性
- linux系统管理中经常用到的几个命令
- JDK1.8源码阅读系列之二:LinkedList
- TextView添加下划线
- 初等数据结构之队列
- Java代码实现下载慕课网视频
- 快速学习bootstrap
- fastJson解析报错com.alibaba.fastjson.JSONException: create instance error, class json.TestFJson$A
- PicassoImgLoadManagerImpl
- java常见面试题<一>
- 系统命令
- mysql5.7解压版-修改初始密码(windows)
- JavaScript 变量
- tensorflow分布式In-graph方式demo