目录
五、IDEA环境下将项目打成 war 包并部署到本地 tomcat 中
一、唐诗项目概述
1、项目简介
在大数据时代,信息的采集是一项非常重要的工作,如果单靠人力进行信息采集整理,不仅低效繁琐,搜索的成本也高。那么此时,我们就可以通过网络爬虫对数据信息进行采集。但在我们自己练习的过程中,可不要选个学校教务系统去爬,要不然还没爬到你就先没了~,网络安全也是非常重要的!所以,要找一个没有反爬虫技术且数据公开合法的,于是,我在这里选择了唐诗三百首进行爬虫,另一方面,web前端开发也是一个十分热门的行业,所以在爬取到数据后我又进行了可视化展示,通过图表更直观,好看,比一大堆文字获取信息更简洁方便,关键是赏心悦目呀。
2、设计思想
2.1、数据爬取模块
- 采集列表页,获取古诗文网首页的html文件
- 分析列表页,采集详情页,即从 html 文件中通过 href 标签拿到每首诗的链接
- 从详情页中提取诗词信息(标题、朝代、作者、正文)
- 计算 sha256(标题+正文),保证数据不会重复
- 调用第三方库对标题与正文进行分词
- 建立数据库与表,将数据存进去
2.2 可视化展示模块
- 浏览器发起 httpServlet 请求,Tomcat 将其作为静态资源处理,返回静态资源
- 浏览器因为 script 标签 GET 所有 js 文件
- js 中通过 jQuery 发起 ajax 请求
- Tomcat 将其作为 Servlet 处理
- 通过 JDBC 执行 sql 语句在数据库中取到数据后 Servlet 使用 FastJSON 把数据序列化为字符串
- 通过自己实现的函数把数据调整为 echarts 满足的格式后传给 echarts
- echarts 进行绘图展示
将数据库中的数据经过整理分别以一个柱形图来表示诗人及他们的创作数量,再对所有诗词的分词及使用频率通过一个词云来展示。
3、核心技术
- Java 操作 MySQL 数据库
- 数据库设计
- 第三方库的使用,比如HtmlUnit、ansj_seg等
- SHA256去重算法
- HTTP协议
- 多线程与线程池的使用
- echarts前端渲染、jQuery前后端交互、JSON响应字符串、ajax前端展示的使用
- 软件测试的方法
4、效果展示
诗人创作排行:
诗词云图展示:
二、数据爬取模块
1、技术选型
1.1 爬虫技术 htmlunit
网页抓取的第三方库有很多比如 HttpClient,HtmlUnit,在对比这两个的使用区别后我选择了 htmlunit
原因:HttpClient是用来模拟HTTP请求的,用的是socket通信,通过get方法来提交请求,只能获取html静态页面的源码,如果页面中有js部分,则不能获取到js执行后的源码。
HtmlUnit是一款无界面的浏览器程序库,它模拟用户去操作浏览器,允许调用页面,填写表单,点击链接等,还可以执行js,有很多的API用起来也非常方便。
引入依赖:
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.36.0</version>
</dependency>
1.2 分词技术 ansj_seg
展示页面涉及到了根据每一个词的出现频率来进行词图的展示。使用ansj_seg库对古诗的标题和正文进行分词,为词云做准备。这个中文分词器正确率高,不容易出做,分词速度也快,效果也比较高。
引入依赖:
<dependency>
<groupId>org.ansj</groupId>
<artifactId>ansj_seg</artifactId>
<version>5.1.6</version>
</dependency>
1.3 JDBC 操作数据库 MySQL
这是一个轻量级的数据库,操作方便,且支持SQL语句。利用客户端我们可以方便的对数据进行存储与管理。
引入依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
1.4 项目管理工具 maven
为什么选择maven开发?
1、maven一个命令就可以完成项目构建过程
2、他可以进行强大的依赖管理
3、可以分阶段进行构建
4、提供web项目的模式
2、用法调研
2.1 请求解析列表页 HtmlUnitDemo
HtmlUnit是一个无界面的浏览器,它自带http客户端,给他一个url,它就会去请求页面。用它里面的webclient类,就可以完成请求和解析,从列表页里筛选我们需要的标签进入详情页。
过程中遇到的问题:抓取网页运行后会出现许多警告,这是因为 HtmlUnit 对 CSS 和 JavaScript 的支持不是很好,因此可以关闭 js 和 CSS 的执行引擎。
//1.请求过程
// 声明一个浏览器对象,版本为 CHROME,try 之后会自动关闭
try(WebClient webClient = new WebClient(BrowserVersion.CHROME)) {
//关闭浏览器的 js 与 css 执行引擎,即不再执行网页中的 js 和 css
//没有关闭 js 和 css 引擎的话会有很多警告
webClient.getOptions().setJavaScriptEnabled(false);
webClient.getOptions().setCssEnabled(false);
//对列表页进行请求,返回一个列表页的 dom 树
HtmlPage page = webClient.getPage("https://so.gushiwen.org/gushi/tangshi.aspx");
System.out.println(page);//HtmlPage(https://so.gushiwen.org/gushi/tangshi.aspx)@777341499
// 2.保存内容
// page.save(new File("唐诗三百首\\列表页.html"));
// 3.从 HTML 中提取需要的信息(解析 - 树的结点的查找)
HtmlElement body = page.getBody();// 取一个结点
System.out.println(body);//HtmlBody[<body onclick="closeshowBos()">]
//获取div标签中class属性为typecont的一组元素,由语法可知它返回的是一个 集合类型
List<HtmlElement> elements = body.getElementsByAttribute(
"div", "class", "typecont");
// //取出第一个就是唐诗三百首中的五言绝句部分
// HtmlElement divElement = elements.get(0);
// List<HtmlElement> aElement = divElement.getElementsByAttribute(
// "a", "target", "_blank");
// System.out.println(aElement.size());//五言绝句中的诗词数量
// System.out.println(aElement.get(0).getAttribute("href"));//打印第一首诗的地址
// 提取所有的
int count=0;
for(HtmlElement element:elements){
List<HtmlElement> list = element.getElementsByTagName("a");
for(HtmlElement e:list){
//获取 a 标签下所有属性为 href 的值
System.out.println(e.getAttribute("href"));
count++;
}
}
System.out.println(count);//诗词总数