通过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:在这里插入图片描述
取出这个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站视频的实现方法,如有错误或纰漏,还请指出

### 使用Java编写程序下载Bilibili视频 考虑到版权和技术限制,直接通过官方API或合法授权的方式获取资源是最优选择。然而,在某些情况下,开发者可能会探索其他技术手段来满足特定需求。 为了使用Java实现B视频下载功能,通常涉及以下几个方面: #### 1. 获取目标视频的真实URL 这一步骤往往依赖于解析网页内容或是调用未公开的API接口。对于Bilibili而言,其网结构和API可能频繁更新,因此建议定期查阅最新的抓包分析资料[^3]。 #### 2. 发起HTTP请求并接收响应数据流 一旦获得了有效的媒体文件链接,就可以利用`HttpURLConnection`或其他第三方库(如Apache HttpClient)发起GET请求,并处理返回的数据流。 ```java import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class VideoDownloader { public static void downloadFile(String fileUrl, String savePath) throws IOException { URL url = new URL(fileUrl); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); InputStream inputStream = httpConn.getInputStream(); FileOutputStream outputStream = new FileOutputStream(new File(savePath)); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, bytesRead); } outputStream.close(); inputStream.close(); System.out.println("Download completed."); } } ``` 需要注意的是,上述代码仅为简化版示例,实际应用中还需考虑异常处理、断点续传等功能增强[^1]。 #### 3. 处理反爬虫机制与合法性验证 部分在线服务会对自动化访问行为采取防护措施,比如验证码校验、IP封禁等。针对这种情况,除了优化User-Agent设置外,还可以尝试模拟浏览器交互过程,甚至借助代理服务器分散压力。不过这些操作都应在遵循法律法规的前提下谨慎行事。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值