(一)实现思路

1,定位弹幕文件

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

2,解析弹幕文件

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

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

1,定位弹幕文件

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

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

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

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

2,解析弹幕文件

2.1 创建基本的maven项目

输入GroupId和ArtifactId

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

选中该jar并点击OK。

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

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

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 getData(String fileName){

ArrayList list = new ArrayList();

try{

File input = new File(fileName);

Document doc = Jsoup.parse(input, "UTF-8");

//每条弹幕的内容都处于标签中,于是根据该标签找到所有弹幕

Elements contents = doc.getElementsByTag("d");

for (Element content : contents) {

list.add(content.text()); //将标签中的文本内容,也就是弹幕内容,添加到list中

}

} catch (Exception e) {

e.printStackTrace();

}

return list;

}

}

复制代码

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

import java.util.ArrayList;

/**

* Created by shuhu on 2018/1/20.

*/

public class Main {

public static void main(String[] args){

ArrayList items = new ArrayList();

//1,通过解析本地文件的方式得到所有弹幕

items = LocalFile.getData("3232417.xml");

//遍历输出每条弹幕

for (String item : items) {

System.out.println(item);

}

}

}

复制代码

输出结果如下:

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

1,添加httpclient依赖

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

org.apache.httpcomponents

httpclient

4.3.3

复制代码

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 getData(String fileName) throws IOException {

ArrayList list = new ArrayList();

//1,创建HttpClient对象,我们使用到Apache中的HttpClient的实例CloseableHttpClient

CloseableHttpClient httpclient = HttpClients.createDefault();

//2,创建HttpGet请求实例,该实例指示向目标URL发起GET请求

HttpGet httpGet = new HttpGet(fileName);

//3,执行HttpGet请求实例,也就是发起GET请求,响应结果保存到httpResponse变量中

CloseableHttpResponse httpResponse = httpclient.execute(httpGet);

try {

//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()); //将标签中的文本内容,也就是弹幕内容,添加到list中

}

} catch (Exception e) {

e.printStackTrace();

} finally {

httpResponse.close();

}

return list;

}

}

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

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 java.util.ArrayList;

/**

* Created by shuhu on 2018/1/20.

*/

public class Main {

public static void main(String[] args){

ArrayList items = new ArrayList();

//1,通过解析本地文件的方式得到所有弹幕

// items = LocalFile.getData("3232417.xml");

//2,通过解析远程服务器文件的方式得到所有弹幕

items = RemoteFile.getData("https://comment.bilibili.com/3232417.xml");

//遍历输出每条弹幕

for (String item : items) {

System.out.println(item);

}

}

}

复制代码

输出结果如下:

项目代码

java获取b站动态列表地址,java获取B站弹幕文件的两种方案相关推荐

  1. java获取b站动态列表地址_爬虫入门(三)爬取b站搜索页视频分析(动态页面,DBUtils存储)...

    这一次终于到了分析b站视频了.开始体会到写博客非常占用学技术的时间,但是还是希望能总结,沉淀下来. 工具:使用Webmaigc框架,DBUtils,C3P0连接池. 分析过程:b站的搜索页面是这样的. ...

  2. ASP.NET根路径的获取和将Web站点下的绝对路径转换为虚拟路径的两种方案

    ASP.NET 根路径的获取         private string _ApplicationPath;           /// <summary>           /// ...

  3. xp系统网页java不显示,xp系统打开jsp文件的两种方法

    使用xp系统的时候会碰到各种文件,比如png.log.exe等等,一位用户说遇到后缀名是jsp的文件,jsp文件是什么?有什么作用呢?jsp格式文件是一种动态网页技术标准,是用java script脚 ...

  4. 创建和应用Java包文件的两种方式(转)

    创建和应用Java包文件的两种方式(转) <Java编程艺术>章节选登.作者:高永强 清华大学出版社 (即将出版) 12.1  包--package    ... 12.1.1  包命名规 ...

  5. Java运行非Web的Springboot项目(测试类或启动主类两种方法)

    Java运行非Web的Springboot项目(测试类或启动主类两种方法) 前言 一.创建打开一个Springboot项目 二.运行项目 1.Test测试类运行 2.启动主类运行 三.持续运行不停止( ...

  6. java读取csv文件的两种方式

    java读取csv文件的两种方式 1.CsvReader读取 import com.csvreader.CsvReader; /*** CsvReader 读取* @param filePath* @ ...

  7. java遍历文件和归类_java读取文件的两种方法:java.io和java.lang.ClassLoader

    java读取文件的两种方法:java.io和java.lang.ClassLoader 什么时候使用java.io,什么时候使用java.lang.ClassLoader呢? (注:要是之前读xml文 ...

  8. java textarea 大小_textarea高度自适应的两种方案

    阅读全文你将获得以下解决方案. 点击长文本编辑textarea,自动获得焦点 随着输入值自动伸缩高度 可复制添加信息 可粘贴文本 可粘贴图片 以下实例代码执行环境为Chrome80 方案一 HTML5 ...

  9. 动态开辟二维数组的两种方案及位体

    动态开辟二维数组的两种方案及位体 一.在静态二维数组中查询数据 二.动态开辟二维数组空间 1.用二级指针的方式开辟 2.用结构体的方式开辟 三.位体 先来回顾一下动态开辟一位数组的方法: #inclu ...

最新文章

  1. 什么是新IP的四层网络技术
  2. 50位全球专家畅谈人工智能治理进程——结伴前行,合作共赢(附下载)
  3. TiDB 源码阅读系列文章(十八)tikv-client(上)
  4. 光流 | 由粗到精的稠密光流算法
  5. 北京沙龙报名 | 关于Dubbo开源的那些事儿
  6. 【STL源码学习】std::list类的类型别名分析
  7. 使用 BoringSSL 优化 HTTPS 加密算法选择(不同终端加密算法不同)
  8. cocos2dx mysql_初次接触cocos2dx
  9. icesat2:strong beam and weak beam
  10. angular4 跨域携带cookie的设置
  11. Unity3D的音效相关介绍
  12. 在雨雾中穿行--张家界之旅786
  13. c语言do while例子,C语言do while循环
  14. 启动报错java.net.ConnectException: [NACOS HTTP-POST] The maximum number of tolerable
  15. RemoteTestkit远程真机调试平台使用教程
  16. uber司机已经激活了,就是还没有上传头
  17. java 获取星期几_java中获取日期是星期几的两种方法
  18. PLSQL查看所连接的ORACLE的版本
  19. HTC Lengend G6上网-彩信设置
  20. Recyclerview数据显示错乱完全解析

热门文章

  1. 新能源汽车应该何去何从?
  2. ue4创建一个游戏模式Game mode
  3. 拼多多校招内推编程题3 六一儿童节
  4. ISBN码识别-DA数据结构二级项目
  5. 《评人工智能如何走向新阶段》后记(再续22)
  6. WGCLOUD——如何统计用户的日活(dau)、月活(mau)数据
  7. C++练习小写变大写
  8. java runtime是什么软件_Java SE Runtime Environment (JRE) 运行Java程序的必备软件
  9. 线性变换到底是什么以及与矩阵之间的联系
  10. 冯东阳:5000元葬送了我的行业网站之梦