java中的接口是类吗
266
2022-08-31
利用Java实现网站聚合工具
目录原理实现代码页面下载解析返回值中的所有链接解析返回值中的title去除返回值中的标签分词获取分词结果的数量前十个遍历网站连通块调用测试
互联网上有数以万亿计的网站,每个网站大都具有一定的功能。搜索引擎虽然对互联网上的部分网站建立了索引,但是其作为一个大而全的搜索系统,无法很好的定位到一些特殊的需求,基于这样的背景,我尝试了写了一个网站数据聚合的程序。现在将原理和实现代码分享给大家。
原理
可以把互联网上的网站看做一张巨大的连通图,不同的网站处于不同的连通块中,然后以广度优先算法遍历这个连通块,就能找到所有的网站域名,利用广度优先算法遍历该连通块的结构可以抽象为:
然后,我们对该网站的返回内容进行分词,剔除无意义的词语和标点符号,就得出该网站首页的关键词排序,我们可以取词频在(10,50)区间范围内的为关键http://词,然后将这些关键词作为网站主题,把网站的信息放到以该词为名字的markdown文件中备用。
同理,我们也对该网站返回内容的title部分进行分词,因为title是网站开发者对网站功能的浓缩,也比较重要,同理,也将这些关键词作为网站主题,把网站的信息放到以该词为名字的markdown文件中备用。
最后,我们只需要从这些文件中人工做筛选,或者以这些数据放到elasticsearch中,做关键词搜索引擎即可。以达到想用的时候随时去拿的目的。
不过,当你遍历连通块没有收敛时,得到的数据还是很少的,某些分类往往只有一两个网站。
实现代码
页面下载
页面下载我使用的是httpClient,前期考虑用playwrite来做,但是两者性能差距太大,后者效率太低了,所以舍弃了部分准确性(即web2.0技术的网站,前者无法拿到数据),所以准确的说我实现的仅仅是web1.0的网站分类搜索引擎的页面下载功能。
public SendReq.ResBody doRequest(String url, String method, Map
String urlTrue = url;
SendReq.ResBody resBody = SendReq.sendReq(urlTrue, method, params, defaultHeaders());
return resBody;
}
其中,SendReq是我封装的一个httpClient的类,只是实现了一个页面下载的功能,你可以替换为RestTemplate或者别的发起http(s)请求的方法。
解析返回值中的所有链接
因为是连通块遍历,那么定义的连通网站就是该网站首页里面所有的外链的域名所在的站,所以我们需要提取链接,直接使用正则表达式提取即可。
public static List
Pattern pattern = Pattern.compile("(http|https):\\/\\/[A-Za-z0-9_\\-\\+.:?&@=\\/%#,;]*");
Matcher matcher = pattern.matcher(htmlText);
Set
while (matcher.find()){
ans.add(DomainUtils.getDomainWithCompleteDomain(matcher.group()));
}
return new ArrayList<>(ans);
}
解析返回值中的title
title是网站开发者对网站功能的浓缩,所以很有必要将title解析出来做进一步处理
public static String getTitle(String htmlText){
Pattern pattern = Pattern.compile("(?<=title\\>).*(?=
Matcher matcher = pattern.matcher(htmlText);
Set
while (matcher.find()){
return matcher.group();
}
return "";
}
去除返回值中的标签
因为后续步骤需要对网站返回值进行分词,所以需要对页面中的标签和代码进行去除。
public static String getContent(String html) {
String ans = "";
try {
html = StringEscapeUtils.unescapeHtml4(html);
html = delHTMLTag(html);
html = htmlTextFormat(html);
return html;
} catch (Exception e) {
e.printStackTrace();
}
return ans;
}
public static String delHTMLTag(String htmlStr) {
String regEx_script = "
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~