本项目分为以下几点
1.获取Bvid
我们首先需要获取Bvid,也就是视频id,如果只想下载一个指定的视频那么直接输入Bvid即可。
如果需要批量下载那么就需要程序帮我们抓取Bvid,关于如何使用爬虫爬取我们需要的信息,可以参考我的另一篇文章:通过Java爬虫实现51job申请职位 的第四部分
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
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代码下载B站视频的实现方法,如有错误或纰漏,还请指出