java获取B站弹幕文件的两种方案

栏目: Java · 发布时间: 8年前

内容简介:java获取B站弹幕文件的两种方案

一般用json或xml格式来保存弹幕,所以我们只要找到视频网页里面的xml文件或json文件,就能定位到弹幕文件。

2,解析弹幕文件

然后通过jsoup解析文件,提取我们弹幕的文本内容。

(二)第一个实现方案,解析本地文件

1,定位弹幕文件

比如我们希望爬取下方视频的弹幕文件。

java获取B站弹幕文件的两种方案

打开Chrome的Network后刷新网页,再输入框中输入xml筛选出xml文件资源:

java获取B站弹幕文件的两种方案

光标移动到该文件上,可以看到该文件具体地址如下:

java获取B站弹幕文件的两种方案

在该文件上右键Open in new tab就可以在新的浏览器页面查看该弹幕文件内容:

java获取B站弹幕文件的两种方案

2,解析弹幕文件

2.1 创建基本的maven项目

java获取B站弹幕文件的两种方案

输入GroupId和ArtifactId

java获取B站弹幕文件的两种方案

本项目中会使用到jsoup这个jar包,于是在项目根目录下创建lib目标,把jar拷贝进去,然后按下面操作将jar包构建到项目中:

java获取B站弹幕文件的两种方案

选中该jar并点击OK。

java获取B站弹幕文件的两种方案

2.2 在项目根目录下创建弹幕文件

在根目录下创建3232417.xml文件,复制 https://comment.bilibili.com/3232417.xml 弹幕页面的内容,保存到该文件中。直接全选复制过去即可,我们后面解析文件的时候只会提取有用的文本,所以第一行内容不用去除,如下:

java获取B站弹幕文件的两种方案

2.3 代码实现

解析本地弹幕xml文件的代码如下:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.util.ArrayList;

/**
 * Created by shuhu on 2018/1/20.
 */
public class LocalFile {

    public static ArrayList<String> getData(String fileName){
        ArrayList<String> list = new ArrayList<String>();
        try{
            File input = new File(fileName);
            Document doc = Jsoup.parse(input, "UTF-8");
            //每条弹幕的内容都处于<d></d>标签中,于是根据该标签找到所有弹幕
            Elements contents = doc.getElementsByTag("d");

            for (Element content : contents) {
                list.add(content.text()); //将<d></d>标签中的文本内容,也就是弹幕内容,添加到list中
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}

在入口类Main.java中调用LocalFile类的getData方法,传入参数为xml文件名,解析每条弹幕并输出:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.util.ArrayList;

/**
 * Created by shuhu on 2018/1/20.
 */
public class LocalFile {

    public static ArrayList<String> getData(String fileName){
        try{
            File input = new File(fileName);
            Document doc = Jsoup.parse(input, "UTF-8");
            //每条弹幕的内容都处于<d></d>标签中,于是根据该标签找到所有弹幕
            Elements contents = doc.getElementsByTag("d");
            ArrayList<String> list = new ArrayList<String>();
            for (Element content : contents) {
                list.add(content.text()); //将<d></d>标签中的文本内容,也就是弹幕内容,添加到list中
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

输出结果如下:

java获取B站弹幕文件的两种方案

(三)第二个实现方案,解析远程服务器文件

1,添加httpclient依赖

由于需要访问远程服务器,所以用到了相关的依赖,该依赖提供了对http服务器的访问功能。在pom.xml文件中添加:

<dependencies>
        <!--提供了对http服务器的访问功能-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.3</version>
        </dependency>
    </dependencies>

2,实现代码

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.util.ArrayList;

/**
 * Created by shuhu on 2018/1/20.
 */
public class RemoteFile {

    public static ArrayList<String> getData(String fileName){
        ArrayList<String> list = new ArrayList<String>();
        //1,创建HttpClient对象,我们使用到Apache中的HttpClient的实例CloseableHttpClient
        CloseableHttpClient httpclient = HttpClients.createDefault();
        //2,创建HttpGet请求实例,该实例指示向目标URL发起GET请求
        HttpGet httpGet = new HttpGet(fileName);
        try {
            //3,执行HttpGet请求实例,也就是发起GET请求,响应结果保存到httpResponse变量中
            CloseableHttpResponse httpResponse = httpclient.execute(httpGet);
            //4,得到弹幕文件的文件内容
            HttpEntity httpEntity = httpResponse.getEntity();
            String httpHtml = EntityUtils.toString(httpEntity);

            //5,解析弹幕文件,把每条弹幕放入list中
            Document doc = Jsoup.parse(httpHtml, "UTF-8");
            Elements contents = doc.getElementsByTag("d");
            for (Element content : contents) {
                list.add(content.text()); //将<d></d>标签中的文本内容,也就是弹幕内容,添加到list中
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return list;
    }
}

CloseableHttpResponse httpResponse = httpclient.execute(httpGet);执行完GET请求后,响应结果存放在httpResponse中。response.getEntity()是响应结果中的消息实体,因为响应结果中还包含其他内容比如Headers等如下图,这里我们只需要关注getEntity()消息实体即可。

java获取B站弹幕文件的两种方案
EntityUtils.toString(response.getEntity()); 返回的是服务端以流的形式写出的响应内容,比如在服务端调用的方法最后为: responseWriter.write("just do it"); 那么 EntityUtils.toString(response.getEntity()); 获取的就是 just do it

这句话。 这里可以简单理解为网页的html代码,即右键查看网页源代码看到的全部html代码。我们需要解析的就是这样的html代码。

在入口类Main.java中调用RemoteFile类的getData方法,传入参数为xml文件名,解析每条弹幕并输出:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.File;
import java.util.ArrayList;

/**
 * Created by shuhu on 2018/1/20.
 */
public class LocalFile {

    public static ArrayList<String> getData(String fileName){
        try{
            File input = new File(fileName);
            Document doc = Jsoup.parse(input, "UTF-8");
            //每条弹幕的内容都处于<d></d>标签中,于是根据该标签找到所有弹幕
            Elements contents = doc.getElementsByTag("d");
            ArrayList<String> list = new ArrayList<String>();
            for (Element content : contents) {
                list.add(content.text()); //将<d></d>标签中的文本内容,也就是弹幕内容,添加到list中
            }
            return list;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

输出结果如下:

java获取B站弹幕文件的两种方案

以上所述就是小编给大家介绍的《java获取B站弹幕文件的两种方案》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

计算复杂性

计算复杂性

阿罗拉 巴拉克 / 骆吉洲 / 机械工业出版社 / 2016-1-1 / 129元

《计算复杂性的现代方法》是一部将所有有关复杂度知识理论集于一体的教程。将最新进展和经典结果结合起来,是一部很难得的研究生入门级教程。既是相关科研人员的一部很好的参考书,也是自学人员很难得的一本很好自学教程。本书一开始引入该领域的最基本知识,然后逐步深入,介绍更多深层次的结果,每章末都附有练习。对复杂度感兴趣的人士,物理学家,数学家以及科研人员这本书都是相当受益。一起来看看 《计算复杂性》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

SHA 加密
SHA 加密

SHA 加密工具

html转js在线工具
html转js在线工具

html转js在线工具