唐诗数据分析
一、项目背景
1. 项目意图
通过分析唐诗数据,让数据以图的形式展示出来。
2. 项目描述
对唐诗的内容进行数据统计并将其以图表等形式可视化出来的一个JavaWeb项目。其中对诗人的作诗量使用柱状图进行展示,对词语的使用频率通过词云进行展示。
2.1 核心功能
- 诗人及其作诗量以柱状图的形式在页面展示;
- 作诗用词按使用频率以云图的形式在页面展示。
2.2 核心技术
- 使用数据库(MySQL),通过JDBC操作MySQL;
- 数据库设计(根据实际场景设计数据库表结构);
- 使用Java中的FastJSON这个库操作JSON数据;
- Servlet的使用;
- 使用HtmlUnit库爬取网页数据;
- 使用ansj_seg库对诗内容进行分词;
- 多线程后台处理;
- 软件测试的基本思想和方法。
二、项目设计
1. 爬取数据
1.1 数据库中表的设计
要存的是唐诗,并且可以按频率展示作诗所用词。至少该包含以下属性:
诗名、作者、朝代、正文、词语。
为了保证插入的不重复我们设置一个SHA-256属性(共64位)。最后再加上主键自增长的id。
CREATE DATABASE tangshi;
USE tangshi;
-- 最终表
CREATE TABLE t_tangshi(
id INT AUTO_INCREMENT PRIMARY KEY,
sha256 CHAR(64) NOT NULL UNIQUE,
dynasty VARCHAR(20) NOT NULL,
title VARCHAR(30) NOT NULL,
author VARCHAR(20) NOT NULL,
content TEXT NOT NULL,
words TEXT NOT NULL
);
1.2 数据采集
- HtmlUnit库对网页进行抓取和解析
使用HtmlUnit库,可以加载一个完整的Html页面爬取数据,这些数据包括HtmlPage,网页的URL,子页面的集合,数据对象等。
- HtmlPage是HtmlUnit库中的一个类,表示一个网页的page对象,可以获取网页的文档信息,比如该页面的内容,标题等;
- 网页的URL,可以发现所有子页面的路径中,前半部分都是一样的,所以我们可以将这个URL分成两部分,前半部分是网站的根地址,后半部分是具体的网页路径。
- getElementsByAttribute()方法
body.getElementsByAttribute(“div”,“class”,“typecont”);
获取div标签中class属性为typecont的html元素。由html的语法可以知道Dom树中可能不只这一个该元素,所以返回值为一个集合类型。
- getAttribute()方法
aElements.get(0).getAttribute(“href”);
可以利用该方法同样获得a标签元素,然后利用该方法获得属性href的值,这个值就是需要的详情页的相对应的访问链接。
- XPath路径
a[1]或a[2]表示该路径下有多个a标签,下标的值从1开始。
1.3 数据解析
采用多线程进行数据解析处理。
抓取首页网站(列表页)由主线程负责,具体每个详情页(每一首的单独页面)由单个子线程进行解析并存入数据库。
注意:
1)无界面的浏览器(HTTP 客户端) WebClient 不是线程安全:每个线程创建自己的client对象;
2)生成SHA-256的MessageDigest不是线程安全:每个线程创建自己的messageDigest对象;
3)连接数据库的Connection不是线程安全:每个线程创建自己的connection对象;
//
public class MultipleThread {
private static class Job implements Runnable{
private String url;
private MessageDigest messageDigest;
private Connection connection;
public Job(String url, MessageDigest messageDigest, Connection connection) {
this.url = url;
this.messageDigest = messageDigest;
this.connection = connection;
}
@Override
public void run() {
WebClient client = new WebClient(BrowserVersion.CHROME);
client.getOptions().setCssEnabled(false)