本项目分为以下几点
- 获取Bvid
- 获取Cid
- 获取视频原始链接
- 使用Java下载视频文件
1.获取Bvid
我们首先需要获取Bvid,也就是视频id,如果只想下载一个指定的视频那么直接输入Bvid即可。
如果需要批量下载那么就需要程序帮我们抓取Bvid,关于如何使用爬虫爬取我们需要的信息,可以参考我的另一篇文章:通过Java爬虫实现51job申请职位 的第四部分
- 获取Bvid
2.获取Cid
这里我们需要用到一条api链接:
https://api.bilibili.com/x/web-interface/view?bvid=
我们将Bvid添加到这条链接末尾进行访问,它会返回一个json文本,其中就包括我们需要的Cid:
取出这个Cid,这里我还是用取字符串的老方法,首先使用jsoup取出网页源码:
Jsoup.connect("https://api.bilibili.com/x/web-interface/view?bvid="+bvids[i]).ignoreContentType(true)
.userAgent("Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.2.15)").timeout(5000).get()
- 注意这里需要提交浏览器标识
之后使用字符串操作取出cid:
int Hcid = httpviourl.indexOf("pages\":[{\"cid\" : ") + "pages\":[{\"cid\":".length();
int Ecid = httpviourl.indexOf(",\"page\" : ");
String cid = httpviourl.substring(Hcid, Ecid);
运行后输出:
102910867
这就是我这个Bvid对应的Cid
- 获取Cid
3.获取视频原始链接
获取到Bvid和Cid后,我们就可以通过另一条api链接来获取视频原始链接:
https://api.bilibili.com/x/player/playurl?otype=json&fnver=0&fnval=2&player=1&qn=64&bvid=Bvid&cid=Cid
将这条链接中的Bvid和Cid换成我们刚刚获取到的,在网页中请求一下,即可获得一个json文本
取出这个json中的’url’链接,这就是我们需要的视频链接
- 获取视频原始链接
4.使用Java下载视频
已经有了视频原始链接了,之后只需要将视频下载下来即可,直接上代码:
//这个类使用了commons-io
public void downloadNew(String urlPath, String descFileName) throws MalformedURLException {
InputStream inputStream = null;
try {
long begin = System.currentTimeMillis();
URL url = new URL(urlPath);
urlConnection = url.openConnection();
urlConnection.setRequestProperty("Referer", "https://www.bilibili.com"); // 设置协议
urlConnection.setRequestProperty("Sec-Fetch-Mode", "no-cors");
urlConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36");
urlConnection.setConnectTimeout(10 * 1000);
System.out.println("共:" + (urlConnection.getContentLength() / 1024) + "Kb");
System.out.println("开始下载...");
InputStream input = urlConnection.getInputStream();
FileUtils.copyInputStreamToFile(input, new File("F:\\ClassAB\\" + descFileName));
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - begin) / 1000 + "秒");
System.out.println("下载完成!");
} catch (Exception e) {
System.out.println("异常中止: " + e);
}
}
- 使用Java下载视频文件
以上即为使用java代码下载B站视频的实现方法,如有错误或纰漏,还请指出