通过java下载B站视频

本项目分为以下几点

  • 获取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:通过java下载B站视频
取出这个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文本
通过java下载B站视频取出这个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站视频的实现方法,如有错误或纰漏,还请指出

上一篇:基于微服务的DevOps落地指南 交付效率提升40%


下一篇:Java代码规范与质量检测插件SonarLint