内容简介:java获取B站弹幕文件的两种方案
一般用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<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; } }
输出结果如下:
(三)第二个实现方案,解析远程服务器文件
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()消息实体即可。
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站弹幕文件的两种方案》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Scala在资源文件夹中获取文件的文件路径
- javascript – Node.js – 文件系统获取文件类型
- 获取python文件扩展名和文件名方法
- bash – 根据时间戳获取最新文件
- Go语言:获取图片文件的类型
- 利用Web应用中隐藏的文件夹和文件获取敏感信息
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
剑指Offer:名企面试官精讲典型编程题(第2版)
何海涛 / 电子工业出版社 / 2017-5 / 65.00
《剑指Offer:名企面试官精讲典型编程题(第2版)》剖析了80个典型的编程面试题,系统整理基础知识、代码质量、解题思路、优化效率和综合能力这5个面试要点。《剑指Offer:名企面试官精讲典型编程题(第2版)》共分7章,主要包括面试的流程,讨论面试每一环节需要注意的问题;面试需要的基础知识,从编程语言、数据结构及算法三方面总结程序员面试知识点;高质量的代码,讨论影响代码质量的3个要素(规范性、完整......一起来看看 《剑指Offer:名企面试官精讲典型编程题(第2版)》 这本书的介绍吧!