太坑了,本来写完了,发布后发现只发了一半,而后面的不知道哪去了,应该是超长了。悲剧的是竟然没有保存,这后半部分我还得重新写啊。
接上篇win7 x64 基于spring boot+elasticsearch+Redis+mysql+mybatis进行搜索引擎web开发--爬取IThome热评(一),我们继续。
上面给出的一篇文章的热评,估计大家能看吐了。你能看明白,我就服了你了。后面我花费了不少时间把这俩例子规范化了一下,大概长下面这个样子:
##https://dyn.ithome.com/ithome/getajaxdata.aspx?newsID=322635&pid=2&type=hotcomment
{
"html":"
<li class=\"entry\" cid=\"27429137\" nid=\"322635\">
<div class=\"adiv\">
<div><a title=\"软媒通行证数字ID:1341046\" target=\"_blank\" href=\"http://quan.ithome.com/user/1341046\"><img class=\"headerimage\" οnerrοr=\"this.src=\u0027//img.ithome.com/images/v2.1/noavatar.png\u0027\" src=\"//avatar.ithome.com/avatars/001/34/10/46_60.jpg\"/> </a></div>
<div class=\"level\"><span>Lv.8</span></div>
</div>
<div>
<div class=\"info rmp\"><strong class=\"p_floor\">14楼</strong>
<div class=\"nmp\"> <span class=\"nick\"> <a title=\"软媒通行证数字ID:1341046\" target=\"_blank\" href=\"http://quan.ithome.com/user/1341046\">zuk常成</a></span><span class=\"mobile android\"><a target=\"_blank\" title=\"App版本:v5.60\" href=\"//m.ithome.com/ithome/download/\">三星 Galaxy S7 edge</a></span><span class=\"posandtime\">IT之家江苏无锡网友\u0026nbsp;2017-8-23 14:35:29</span></div>
</div>
<p>工信部安卓统一推送呢?现在的安卓就是不如iOS。最起码国内的不行,难道用个手机天天翻墙?</p>
<div class=\"zhiChi\"><div class=\"l\"> <span class=\"comm_reply\"><a class=\"comment_co\">展开(69)<img src=\"//img.ithome.com/images/v2.3/arrow.png\"></a></span></div>
<div class=\"r\"> <span class=\"comm_reply\"> <a class=\"s\" id=\"hotagree27429137\" href=\"javascript:hotCommentVote(27429137,1)\">支持(238)</a><a class=\"a\" id=\"hotagainst27429137\" href=\"javascript:hotCommentVote(27429137,2)\">反对(11)</a> </span></div>
</div>
</li>
...
<li class=\"entry\" cid=\"27429137\" nid=\"322635\">
<div class=\"adiv\">
<div><a title=\"软媒通行证数字ID:789770\" target=\"_blank\" href=\"http://quan.ithome.com/user/789770\"><img class=\"headerimage\" οnerrοr=\"this.src=\u0027//img.ithome.com/images/v2.1/noavatar.png\u0027\" src=\"//avatar.ithome.com/avatars/000/78/97/70_60.jpg\"/></a></div>
<div class=\"level\"><span>Lv.30</span></div>
</div>
<div>
<div class=\"info rmp\"><strong class=\"p_floor\">14楼8#</strong>
<div class=\"nmp\"><span class=\"nick\"><a title=\"软媒通行证数字ID:789770\" target=\"_blank\" href=\"http://quan.ithome.com/user/789770\">wp咸蛋</a></span><span class=\"mobile android\"><a target=\"_blank\" title=\"App版本:v5.60\" href=\"//m.ithome.com/ithome/download/\">小米 6</a></span><span class=\"posandtime\">IT之家河北承德网友\u0026nbsp;2017-8-23 15:05:43</span></div>
</div>
<p><span>回复6# belie97:</span>QQ微信不支持mipush。。。。</p>
<div class=\"zhiChi\">
<div class=\"l\"><span class=\"comm_reply\"><a class=\"comment_co\">展开(69)<img src=\"//img.ithome.com/images/v2.3/arrow.png\"></a></span></div>
<div class=\"r\"><span class=\"comm_reply\"><a class=\"s\" id=\"hotagree27430293\" href=\"javascript:hotCommentVote(27430293,1)\">支持(11)</a><a class=\"a\" id=\"hotagainst27430293\" href=\"javascript:hotCommentVote(27430293,2)\">反对(1)</a></span></div>
</div>
</li>
",
"db":true
}
这下,看的舒服多了吧。unicode编码的处理程序,参考我们的文章。由于返回的不是json格式,所以我们这里只能硬解析。我猜测每一条评论的完整信息包含在<li>...</li>之间,那么我们可以按照它进行分割,然后使用substring函数,一段段的截取数据,然后解析出需要的字段。字段需求如下:
private Long id;//热评编号
private String commentId;
private String user;//用户
private String comment;//内容
private int up;//支持数
private int down;//反对数
private String posandtime;//位置和时间
private String mobile;//设备
private String articleUrl;//源文章地址
7. mysql配置
在运行过程中,我们遇到一些手机app发送的表情符号等字符,而utf-8使用3个字节存储文件,一般文字是够用了,而对于手机app等需要4个字节存储的表情符号等则无能为力,报错内容如下:Incorrect string value: '\xF0\x9F\x98\x82\xF0\x9F...' for column
这里需要修改mysql的配置文件
修改mysql的配置文件,windows下的为my.ini(linux下的为my.cnf),修改的内容都一样
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
将数据库中对应的字段,改为utf8mb4_general_ci
修改项目中的连接数据库的url,将characterEncoding=utf-8去掉,此步骤一定要进行
8. ES和redis配置
#端口号
server:
port: 8081
spring:
data:
##elasticsearch配置
elasticsearch:
cluster-name: oldkingESCluster
cluster-nodes: 127.0.0.1:9300
##redis配置
redis:
database: 0
host: localhost
port: 6379
password: redis
pool:
max-active: 15
max-wait: 1
max-idle: 0
timeout: 0
##freemarker配置
freemarker:
##是否允许属性覆盖
allow-request-override: false
allow-session-override: false
cache: true
check-template-location: true
content-type: text/html
##暴露request属性
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: false
suffix: .ftl
template-loader-path: classpath:/templates/
request-context-attribute: request
settings:
classic_compatible: true
locale: zh_CN
date_format: yyyy-MM-dd
time_format: HH:mm:ss
datetime_format: yyyy-MM-dd HH:mm:ss
这里比较简单,一般都能看懂。
9. 项目说明
这里,工程比较简单,代码也比较少,得益于springboot和mybatis。
主要三个包:源码包,测试包,web页面包
这里,我把爬虫爬取页面的过程放到了test里面,数据存储到mysql,索引存到redis,也就是当你编译工程的时候,它就会爬取评论,至于爬多少,你可以设置:
@Test
public void getArticleLinks() throws Exception {
for(int i=1;i<2;i++){//原来是i=0,我改成1了,因为放到url中page=0时无法获取内容
String url = "https://www.ithome.com/ithome/getajaxdata.aspx?" +
"page="+i+"&type=indexpage&randnum="+Math.random();
String src = webCrawler.getHtmlSrc(url,"utf-8");
List<String> list = webCrawler.getArticleLinks(src);
for (String link:list){
//System.out.println(link);
webCrawler.parseAndSaveHotComments(link);
}
}
// Assert.assertNull(list);
}
编译成功后,运行工程,然后打开浏览器:localhost:8081/ithome/index,可以看到下图,但是搜索功能还有点问题,后面我会修改。
10. 后续工作
(1)搜索体验
(2)统计结果可视化
(3)索引优化
附:
(2)elasticsearch2.4.6
(3)redis 3.1
(4)treeNMS
(5)nodejs