Java爬取并分析网络敏感词
界面上方为一个网址输入框,输入网址后,点击“爬取”按钮可爬取指定网址的文本并进行敏感词匹配分析,将爬取的网页文本以黑色字体显示在界面中央的面板上,匹配出的敏感词以一个集合列出,并统计出个数,以红色字体在最后列出。
点击“读取文本”的按钮即可实现从web.txt文本中按行读取网址,进一步爬取网页,匹配敏感词。
首先调用styleInit,用于在面板中实现敏感词高亮设置好字体颜色类型的函数。界面布局具体见代码,
设置两个不同颜色的style,用来区别敏感词与网页文本。
该函数传入一个字符串类型的参数,作为爬取的网址。爬取网页使用的是外包Jsoup的功能,与Java内包相比,更实用,更便捷。用Jsoup.connect(web).get()并赋值给Document类型的doc变量,再获取所有的element元素,有很多嵌套的重复的元素,通过遍历所有的元素,若hasText()为真,则将其转化为字符串,并调用敏感词匹配,将匹配到的结果累加到Set中,由于其反复添加不重复的特性,所以遍历完后得到的Set就是此网页所有的敏感词集合。遍历结束后,判断Set是否为空,即是否含有敏感词汇,若是则将其个数与词集合添加到面板上。并添加到log.txt中,作为记录。
因为主类实现了ActionListener接口,此处判读点击的按钮,若点击的为“读取文本”,则调用handleRead函数,若点击的是“爬取”,则调用handleClimb函数。
按行读取文本中的网址,分别进行爬取,当爬取到最后一行再读取下一行时,捕捉异常,弹出“文本中所有网址都已经分析完毕!”窗口。
将输入框中的文本作为参数传入getItemContent函数中。
具体见代码。
读取敏感词库,并加入HashMap中,在一个敏感词结束时加上isEnd标志,方便匹配时找到结尾。例:若词库包含:“中国、中国人、中国人口、中国人民”这四个词,则对应下图。将所有敏感词库的词按照上述方法加入到HashMap中后,含有相同第一字符的词归为一棵树,根为他们相同的第一字符,很大比例的压缩了词库,匹配是首先将待匹配的词第一字符与词库中所有的根节点字符做匹配,若不满足,则可匹配下一字符。这样匹配的速度大大提高(在很多词有相同的第一字符的前提下,而事实上,很多敏感词库都存在这样的现象)。
首先结合上述例子和图说明一下敏感词过滤涉及到的最大匹配和最小匹配:
若待匹配词有出现“中国人”,在最小匹配规则的情况下,得到的敏感词为中国,因为当匹配到“国”字时,已经能够匹配到“isEnd”,这时直接返回每匹配到一个字就自加1的matchFlag,后续通过长度获得具体敏感词。在最大匹配敏感词的情况下,得到的敏感词为中国人,在匹配到“国”字的时候,既能匹配到“isEnd”,又能匹配到“人”,此时选择匹配“人”。此为最大匹配和最小匹配的区别。
爬取的搜狐网页文本:
敏感词输出为红色:
log.txt文本中存入的敏感词记录