数据可视化-唐诗分析器项目分析+实现+测试+部署

目录

一、唐诗项目概述

1、项目简介

2、设计思想

2.1、数据爬取模块

2.2 可视化展示模块

3、核心技术

4、效果展示

二、数据爬取模块

1、技术选型

1.1 爬虫技术 htmlunit

1.3 JDBC 操作数据库 MySQL

1.4 项目管理工具 maven

2、用法调研

2.1 请求解析列表页 HtmlUnitDemo

2.2 请求解析详情页 XPathDemo

2.3 sha256 算法去重

2.4 计算分词

2.5 存入数据库

3、整体代码

3.1单线程版本

3.2 性能优化-多线程

3.3 总结

三、可视化分析模块

1、技术选型

1.1 前端页面展示渲染工具( echarts )

1.2 jQuery 发起的 ajax 请求

1.3 JSON 第三方库的选择

2、代码开发

2.1 JDBC 建立数据库连接

2.2 整理作者诗词数量 RankServlet

2.3 整理分词 WordsServlet

2.4 前后端交互

四、项目测试

1、功能测试

2、性能测试

3、界面测试

4、兼容性测试

5、易用性测试

6、安全性测试

五、IDEA环境下将项目打成 war 包并部署到本地 tomcat 中

1、打war包

2、部署


 

一、唐诗项目概述

1、项目简介

       在大数据时代,信息的采集是一项非常重要的工作,如果单靠人力进行信息采集整理,不仅低效繁琐,搜索的成本也高。那么此时,我们就可以通过网络爬虫对数据信息进行采集。但在我们自己练习的过程中,可不要选个学校教务系统去爬,要不然还没爬到你就先没了~,网络安全也是非常重要的!所以,要找一个没有反爬虫技术且数据公开合法的,于是,我在这里选择了唐诗三百首进行爬虫,另一方面,web前端开发也是一个十分热门的行业,所以在爬取到数据后我又进行了可视化展示,通过图表更直观,好看,比一大堆文字获取信息更简洁方便,关键是赏心悦目呀。

2、设计思想

2.1、数据爬取模块

  1. 采集列表页,获取古诗文网首页的html文件
  2. 分析列表页,采集详情页,即从 html 文件中通过 href 标签拿到每首诗的链接
  3. 从详情页中提取诗词信息(标题、朝代、作者、正文)
  4. 计算 sha256(标题+正文),保证数据不会重复
  5. 调用第三方库对标题与正文进行分词
  6. 建立数据库与表,将数据存进去

2.2 可视化展示模块

  1. 浏览器发起 httpServlet 请求,Tomcat 将其作为静态资源处理,返回静态资源
  2. 浏览器因为 script 标签 GET 所有 js 文件
  3. js 中通过 jQuery 发起 ajax 请求
  4. Tomcat 将其作为 Servlet 处理
  5. 通过 JDBC 执行 sql 语句在数据库中取到数据后 Servlet 使用 FastJSON 把数据序列化为字符串
  6. 通过自己实现的函数把数据调整为 echarts 满足的格式后传给 echarts
  7. 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);//诗词总数

2.2 请求解析详情页 XPath

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值