怎么用Java实现网站聚合工具
这篇文章主要介绍"怎么用Java实现网站聚合工具"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么用Java实现网站聚合工具"文章能帮助大家解决问题。
原理
可以把互联网上的网站看做一张巨大的连通图,不同的网站处于不同的连通块中,然后以广度优先算法遍历这个连通块,就能找到所有的网站域名,利用广度优先算法遍历该连通块的结构可以抽象为:
然后,我们对该网站的返回内容进行分词,剔除无意义的词语和标点符号,就得出该网站首页的关键词排序,我们可以取词频在(10,50)区间范围内的为关键词,然后将这些关键词作为网站主题,把网站的信息放到以该词为名字的markdown文件中备用。
同理,我们也对该网站返回内容的title部分进行分词,因为title是网站开发者对网站功能的浓缩,也比较重要,同理,也将这些关键词作为网站主题,把网站的信息放到以该词为名字的markdown文件中备用。
最后,我们只需要从这些文件中人工做筛选,或者以这些数据放到elasticsearch中,做关键词搜索引擎即可。以达到想用的时候随时去拿的目的。
不过,当你遍历连通块没有收敛时,得到的数据还是很少的,某些分类往往只有一两个网站。
实现代码
页面下载
页面下载我使用的是httpClient,前期考虑用playwrite来做,但是两者性能差距太大,后者效率太低了,所以舍弃了部分准确性(即web2.0技术的网站,前者无法拿到数据),所以准确的说我实现的仅仅是web1.0的网站分类搜索引擎的页面下载功能。
public SendReq.ResBody doRequest(String url, String method, Mapparams) { String urlTrue = url; SendReq.ResBody resBody = SendReq.sendReq(urlTrue, method, params, defaultHeaders()); return resBody;}
其中,SendReq是我封装的一个httpClient的类,只是实现了一个页面下载的功能,你可以替换为RestTemplate或者别的发起http(s)请求的方法。
解析返回值中的所有链接
因为是连通块遍历,那么定义的连通网站就是该网站首页里面所有的外链的域名所在的站,所以我们需要提取链接,直接使用正则表达式提取即可。
public static ListgetUrls(String htmlText) { Pattern pattern = Pattern.compile("(http|https):\\/\\/[A-Za-z0-9_\\-\\+.:?&@=\\/%#,;]*"); Matcher matcher = pattern.matcher(htmlText); Set ans = new HashSet<>(); 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\\>).*(?= ans = new HashSet<>(); 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 = "