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站弹幕文件的两种方案》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Head First Design Patterns

Head First Design Patterns

Elisabeth Freeman、Eric Freeman、Bert Bates、Kathy Sierra、Elisabeth Robson / O'Reilly Media / 2004-11-1 / USD 49.99

You're not alone. At any given moment, somewhere in the world someone struggles with the same software design problems you have. You know you don't want to reinvent the wheel (or worse, a flat tire),......一起来看看 《Head First Design Patterns》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具