天天看点

唐诗分析器

数据可视化— — 唐诗分析

一、抓取模块

1.步骤

1)抓取详情页(html格式)

2)从html中提取1)详情页信息 2)总共抓多少诗

3)分别抓取详情页(html格式)

4)从详情页html中提取诗词信息(标题、朝代、作者、正文)

5)计算sha256(标题+正文)求一个hash值,保证数据不重复

6)调用一个分词第三方库,对内容进行分词

7)把数据保存到数据库的表中

2.数据抓取阶段需要的第三方依赖

1)数据库操作

2)HTML页面请求+解析:htmlunit

3)分词:ansj_seg

项目编写

1.预研阶段

1)技术选型:网页抓取的第三方库很多,为什么选择了htmlunit

大家都在用,出现问题可以请教,htmlunit比较成熟

2)用法调研:可以通过实现简单的demo,熟悉库的使用

3)实验评估:效率是否满足需求,内存使用是否满足需求,使用过程中是否遇到的复杂问题

通过域名得到ip地址

ping so.gushiwen.org(其中一个ip)

nslookup so.gushiwen.org(所有ip)

wireshark过滤条件

1)ip.addr219.144.99.106

2)http.hostso.gushiwen.org

3.建表

create database db_tangshi charset utf8;
use db_tangshi;
           

唐诗表:

1)自增主键

2)朝代

3)标题

4)作者

5)正文

6)分词信息(用逗号分割的词)

7)唯一键hash(标题+正文) SHA-256

create table tangshi(
	id int primary key auto_increment,
	sha256 char(64) not null unique,
	dynasty varchar(10) not null,
	title varchar(100) not null,
	author varchar(10) not null,
	content text not null,
	words text not null
	);
           

4.多线程版本

1)提高效率

将请求详情页,提取诗词信息,计算sha256,计算分词,存数据库

2)问题

WebClient不是线程安全的:每个线程创建自己的client对象

Connection不是线程安全的:每个线程创建自己的connection

MessageDigest不是线程安全的:每个有自己的对象

3)重复插入错误

如果是重复插入,忽略错误

catch (SQLException e) {
     if(!e.getMessage().contains("Duplicate entry")){
           e.printStackTrace();
     }
}
           

4)进程不会结束

原因:JVM结束的条件:所有非后台线程结束才会结束

线程池中的线程是不会结束的

改进方法:

1》等所有的诗都下载结束,调用pool.shutdown()才能结束

2》CountDownLutch

等的线程await()

完成线程countDown()

5.代码部分

1)下载详情页

2)解析详情页

3)计算SHA-256

4)计算分词

5)保存数据库

二、可视化

1.开发步骤

1)只用echarts,数据是写死的,开发想要的效果出来

2)预研下ajax技术,选择使用jquery来进行ajax请求,理由使用jquery相对比较简单,文档比较成熟,只用jquery,完成了一个最简单的ajax情况(数据是静态数据)

3)集合echarts和jquery,完成了一个针对静态数据的ajax请求+可视化效果

4)把静态资源替换成动态资源,把写死的这个rank.json中的数据改成Servlet处理,从DB中读取

5)预研返回JSON的第三方库(Gson)

2.词频统计

1.通过select words from tangshi:拿到所有的词

2.通过Map,统计每个词出现的次数