1  题目要求

  1. 编写界面,输入一个网址,能够爬取该网址上所有的HTML源代码。
  2. 对网址中的文本进行提取。
  3. 建立敏感词库,用文本文件保存。
  4. 将该网址所对应的文本中的敏感词提取并高亮显示。
  5. 编写文本文件,可以存入多个网址;程序可爬取这些网址中的文本内容,将敏感词记录存入另一个文件,格式自定。
  6. 编写一个主界面,整合上述功能。

2  设计思路

  1. 采用JavaURL类连接网页网页。
  2. 爬取html代码:使用URLConection配合BufferedReader逐行读取html源代码。
  3. 提取网页文本:使用Java正则表达式匹配html源代码,过滤其中的标签等信息。
  4. 高亮显示敏感词:获取文本框中的Highlighter进行高亮显示,匹配到敏感词则进行高亮显示
  5. 爬取多个网址:分别爬取每个网址,统计每个网址中的敏感词数据,最后进行数据汇总,并将数据都写入文本中。

3  实现过程

3.1  设计思想

1) 使用多线程,提高并发率,爬取单个网址时开启一个线程,爬取多个网址时开启一个线程。

2) 使用JavaURL连接网址获取html代码,并添加进度条提示用户,提高用户体验。

3)设计正则表达式,将网页源代码中的标签以及图案乱码信息进行过滤。

4)匹配敏感词,每次匹配时更新匹配条件。

代码如下:

package spider;import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
import javax.swing.text.Highlighter;public class SpiderFrame extends JFrame implements ActionListener{private JPanel jPanel=new JPanel();private JPanel jpl1=new JPanel();private JPanel jpl2=new JPanel();private JPanel jpl3=new JPanel();private JPanel jpl4=new JPanel();private JPanel jpl5=new JPanel();private JPanel jpl6=new JPanel();private JPanel jpl7=new JPanel();private JPanel jpl8=new JPanel();private JLabel siteWarn=new JLabel("输入网址:");private JTextField siteField=new JTextField(25);private JScrollPane siteSPane=new JScrollPane(siteField);private JButton goSpider=new JButton("开始爬取");private JTextArea htmlArea=new JTextArea(15, 25);private JScrollPane htmlSPane=new JScrollPane(htmlArea);private JTextArea textArea=new JTextArea(15,25);private JScrollPane textSPane=new JScrollPane(textArea);private JTabbedPane tabPane=new JTabbedPane();private JTextArea sensWord=new JTextArea(8,25);private JScrollPane wordPane=new JScrollPane(sensWord);private JButton openLib=new JButton(" 导入敏感词库");private JButton match=new JButton("匹配");private JButton siteLib=new JButton("导入网址库");private JComboBox<String> charset=new JComboBox<String>();private String textType="UTF-8";private ArrayList<String> wordList=new ArrayList<String>();     //保存敏感词private ArrayList<Integer> wordNum=new ArrayList<Integer>();    //保存对应敏感词的出现次数//设置正则表达式的匹配符private String regExHtml="<[^>]+>";     //匹配标签private String regExScript = "<script[^>]*?>[\\s\\S]*?<\\/script>";     //匹配script标签private String regExStyle = "<style[^>]*?>[\\s\\S]*?<\\/style>";      //匹配style标签private String regExSpace="[\\s]{2,}";    //匹配连续空格或回车等private String regExImg="&[\\S]*?;+";   //匹配网页上图案的乱码//定义正则表达式private Pattern pattern3=Pattern.compile(regExHtml, Pattern.CASE_INSENSITIVE);private Pattern pattern1=Pattern.compile(regExScript,Pattern.CASE_INSENSITIVE);private Pattern pattern2=Pattern.compile(regExStyle,Pattern.CASE_INSENSITIVE);private Pattern pattern4=Pattern.compile(regExSpace, Pattern.CASE_INSENSITIVE);private Pattern pattern5=Pattern.compile(regExImg,Pattern.CASE_INSENSITIVE);public SpiderFrame() throws IOException {//设置界面风格try {UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());} catch (ClassNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (InstantiationException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IllegalAccessException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (UnsupportedLookAndFeelException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}this.setTitle("Spider");this.setLocation(400, 200);this.setSize(600, 500);this.setDefaultCloseOperation(EXIT_ON_CLOSE);jPanel.setLayout(new BorderLayout());//添加编码方式charset.addItem("UTF-8");charset.addItem("GBK");charset.setEditable(false);    //设置为不可编辑//处理其事件,更新编码方式charset.addActionListener(new ActionListener() {//获取选择的编码方式,默认情况下为UTF-8@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubtextType=(String)charset.getSelectedItem();}});//界面处理,提醒输入网址,爬取按钮,以及编码方式选择jpl1.setLayout(new BorderLayout());siteWarn.setPreferredSize(new Dimension(70,30));siteSPane.setPreferredSize(new Dimension(300, 30));goSpider.setPreferredSize(new Dimension(90, 30));jpl5.setLayout(new GridLayout(1, 2, 10,10));jpl5.add(goSpider);jpl5.add(charset);jpl1.add(siteWarn,BorderLayout.WEST);jpl1.add(siteSPane,BorderLayout.CENTER);jpl1.add(jpl5,BorderLayout.EAST);//源代码文本,以及处理后的文本框设置htmlArea.setEditable(false);htmlArea.setLineWrap(true);htmlArea.setFont(new Font("宋体", Font.PLAIN, 14));jpl2.setLayout(new BorderLayout());jpl2.add(htmlSPane,BorderLayout.CENTER);//设置布局jpl8.setLayout(new GridLayout(2, 1, 10,5));jpl8.add(siteLib);jpl8.add(openLib);jpl3.setLayout(new BorderLayout());sensWord.setLineWrap(true);sensWord.setEditable(false);wordPane.setPreferredSize(new Dimension(6, 400));jpl3.add(jpl8,BorderLayout.NORTH);jpl3.add(wordPane,BorderLayout.CENTER);jpl3.add(match,BorderLayout.SOUTH);textArea.setFont(new Font("宋体", Font.PLAIN, 14));textArea.setEditable(false);textArea.setLineWrap(true);jpl4.setLayout(new BorderLayout());jpl4.add(textSPane,BorderLayout.CENTER);tabPane.add("html源代码", jpl2);tabPane.add("网页文本",jpl4);jpl7.setLayout(new BorderLayout());jpl7.add(tabPane,BorderLayout.CENTER);jpl6.setLayout(new BorderLayout());jpl6.add(jpl7,BorderLayout.CENTER);jpl6.add(jpl3,BorderLayout.EAST);jPanel.add(jpl1,BorderLayout.NORTH);jPanel.add(jpl6,BorderLayout.CENTER);this.add(jPanel);this.setVisible(true);//事件处理goSpider.addActionListener(this);siteLib.addActionListener(this);openLib.addActionListener(this);match.addActionListener(this);}//使用URL爬取网页的html代码public String getHtml(String website) {String str=null;String text="";        //保存网页的内容try {URL url=new URL(website);    //建立对应的URL对象URLConnection urlConne=url.openConnection();   //连接urlConne.connect(); //获取输入流BufferedReader br=new BufferedReader(new InputStreamReader(urlConne.getInputStream(),textType));System.out.println("开始爬取");while(true) {  //爬取到结束str=br.readLine();if(str==null)   break;text+=(str+"\n");}br.close();        //关闭输入流}catch (Exception e) {// TODO: handle exceptionJOptionPane.showMessageDialog(null, website+"爬取源代码失败");}System.out.println("爬取结束");return text;  //返回html代码文本}//对html进行正则匹配,提取出其中的文本public String getText(String str) {Matcher matcher=pattern1.matcher(str);str=matcher.replaceAll("");     //匹配普通标签matcher=pattern2.matcher(str);str=matcher.replaceAll("");       //匹配script标签matcher=pattern3.matcher(str);str=matcher.replaceAll("");       //匹配style标签matcher=pattern4.matcher(str);str=matcher.replaceAll("\n");  //匹配连续回车或空格matcher=pattern5.matcher(str);str=matcher.replaceAll("");        //匹配网页图案出现的乱码return str;        //返回文本}//从文件中读取敏感词public void getLib() {JFileChooser fChooser=new JFileChooser();  //文件选择框int ok=fChooser.showOpenDialog(this);if(ok!=JFileChooser.APPROVE_OPTION)   return; //判断是否正常选择wordList.clear(); //清空之前的记录sensWord.setText("");File choosenLib=fChooser.getSelectedFile();    //获取选择的文件BufferedReader br=null;try {  //读取选中文件中的记录br=new BufferedReader(new FileReader(choosenLib));while(true) {String str=br.readLine();if(str==null)   break;wordList.add(str);    //添加到记录中wordNum.add(0);     //设置对应的初始值sensWord.append(str+"\n"); //添加到界面中}br.close();    //关闭文件流} catch (FileNotFoundException e1) {// TODO Auto-generated catch blockJOptionPane.showMessageDialog(null, "文件不存在");e1.printStackTrace();} catch (IOException e1) {// TODO Auto-generated catch blockJOptionPane.showMessageDialog(null, "文件读取失败");e1.printStackTrace();}}//高亮显示public void showSensword() {Highlighter hg=textArea.getHighlighter();    //设置文本框的高亮显示hg.removeAllHighlights();   //清除之前的高亮显示记录String text=textArea.getText();   //得到文本框的文本DefaultHighlightPainter painter=new DefaultHighlightPainter(Color.YELLOW);   //设置高亮显示颜色为黄色for(String str:wordList) { //匹配其中的每一个敏感词int index=0;while((index=text.indexOf(str,index))>=0) {try {hg.addHighlight(index, index+str.length(), painter);    //高亮显示匹配到的词语index+=str.length();  //更新匹配条件继续匹配} catch (BadLocationException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}//爬取网址库中的网址public void spiderAll() {if(wordNum.size()<=0) {     //判断是否选择了敏感词库JOptionPane.showMessageDialog(null, "请先选择敏感词库");return;}JFileChooser fChooser=new JFileChooser();   //选择网库文件int ok=fChooser.showOpenDialog(this);if(ok!=JFileChooser.APPROVE_OPTION)  return;File file=fChooser.getSelectedFile();new SpiderAll(this, file).start(); //开启线程爬取}public static void main(String[] args) throws IOException {new SpiderFrame();}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubJButton j=(JButton)e.getSource();   //判断操作来源if(j==goSpider) { //爬取单个网址String website=siteField.getText();new SpiderOne(this,website).start();}else if (j==openLib) {       //打开敏感词库getLib();}else if (j==match){ //匹配单个网址的敏感词高亮显示showSensword();}else if(j==siteLib) { //爬取网址库中的全部网址spiderAll();}}//爬取单个网址线程class SpiderOne extends Thread{    private String website=null;   //网页链接private MyProgressBar mpb=null;  //进度条//构造函数初始化public SpiderOne(JFrame fa,String s) {website=s;mpb=new MyProgressBar(fa, "Spiding");}public void run() {if(website.length()<=0) {    //判断网址是否正常JOptionPane.showMessageDialog(null, "网址不能为空");return;}htmlArea.setText("");   //清除文本textArea.setText("");mpb.setText("爬取"+website+"中...");    //设置进度条界面标题mpb.setVisible(true);        //显示进度条String html=getHtml(website);   //开始爬取mpb.dispose();    //关闭进度条if(html.length()>0) { //若爬取正常JOptionPane.showMessageDialog(null, "爬取完毕");   //提示完成htmlArea.append(html);    //显示html源代码String text=getText(html);  //匹配网页文本textArea.append(text);  //显示网页文本}}}//爬取网址库class SpiderAll extends Thread{private File file=null;       //网址库文本文件private MyProgressBar mpb=null;       //进度条//构造函数初始化public SpiderAll(JFrame fa,File f) {file=f;mpb=new MyProgressBar(fa, "Spiding");}public void run() {try {//读取网址库中的网址BufferedReader brr=new BufferedReader(new FileReader(file));//将匹配数据写入文本中PrintStream ps=new PrintStream(new File("data.txt"));ps.println("敏感词记录如下:");int size=wordList.size();mpb.setVisible(true); //显示进度条while(true) {String website=brr.readLine();if(website==null)  break;mpb.setText("爬取"+website+"中...");   //设置进度条界面标题ps.println(website+"数据如下: ");String html=getHtml(website);   //获取html代码String text=getText(html);       //匹配网页文本for(int i=0;i<size;i++) {     //在网页文本中进行匹配String word=wordList.get(i);int index=0,account=0,len=word.length();while((index=text.indexOf(word,index))>=0) {account++;int temp=wordNum.get(i);  //更新数据wordNum.set(i,++temp);index+=len;     //更新匹配条件}ps.println(word+"  出现  "+account+"次");  //写入当前数据}ps.println();}brr.close(); //关闭文件流System.out.println("爬取完毕");ps.println("总数据如下:     ");        //写入总数据for(int i=0;i<size;i++) {ps.println(wordList.get(i)+"  出现    "+wordNum.get(i)+"次");}ps.close();     //关闭文件流JOptionPane.showMessageDialog(null, "爬取完毕!请打开文件查看!");}catch (Exception e) {// TODO: handle exceptionJOptionPane.showMessageDialog(null, "爬取失败");      }finally {mpb.dispose();    //关闭进度条}}}
}//进度条设计
class MyProgressBar extends JDialog {private static final long serialVersionUID = 1L;private JPanel jPanel=new JPanel();private JProgressBar jpb=new JProgressBar(); //进度条private JLabel curSpiding=new JLabel();   //显示当前网址//构造函数初始化,设置父窗口以及标题public MyProgressBar(JFrame f,String title) {super(f,title);this.setLocation(f.getWidth()/2+(int)f.getLocation().getX()/2-80, f.getHeight()/2+(int)f.getLocation().getY()/2-30);this.setSize(400,100);this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);jpb.setString("玩命加载中...");jpb.setIndeterminate(true);      //设置进度条为不确定模式jpb.setStringPainted(true);jpb.setBorderPainted(false);jpb.setForeground(Color.RED);   //设置进度条颜色jpb.setBackground(Color.WHITE);    //设置背景curSpiding.setPreferredSize(new Dimension(400, 30));//界面布局jPanel.setLayout(new BorderLayout());jPanel.add(curSpiding,BorderLayout.NORTH);jPanel.add(jpb,BorderLayout.CENTER);this.add(jPanel);}//设置当前爬取网址接口public void setText(String text) {curSpiding.setText(text);}
}

运行界面:

JavaURL网络爬虫+敏感词匹配+GUI相关推荐

  1. 很全的敏感词匹配系统的设计与实践

    作者:vivo互联网服务器团队-Liang Kangwu 一.前言 谛听系统是vivo的内容审核平台,保障了vivo各互联网产品持续健康的发展.谛听支持审核多种内容类型,但日常主要审核的内容是文本,下 ...

  2. 如何设计一个敏感词匹配系统?

    ▲ 点击上方"分布式实验室"关注公众号 回复"1"抽取纸质技术书 谛听系统是vivo的内容审核平台,保障了vivo各互联网产品持续健康的发展.谛听支持审核多种内 ...

  3. Python番外篇:网络爬虫组词程序

    今天,双是番外篇,这次番外篇主要教大家如何用网络爬虫查询词语. 1.确定数据源 首先,我们得找一个查询的数据源,我找到了360国学网站,选择"词语大全",它的查询词语网址为: ht ...

  4. 敏感词过滤工具类(DFA算法匹配字典)

    直接调用方法:wordFilter package com.util;import java.io.BufferedReader; import java.io.FileNotFoundExcepti ...

  5. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)...

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  6. 敏感词过滤之——自定义构建查询词库与快速查询实现

    关于敏感词过滤的一点思考与实践 业务场景 思考与研究 逻辑分析 代码实现(php) 构建敏感词树 分割字符串 敏感词树长分支的递归实现 读取敏感词库 敏感词树的查询 查询实现 调用 测试.分析与总结 ...

  7. Android 敏感词过滤实现

    Android 敏感词过滤实现 今天公司提出来一个在手机端输入文字的时候直接过滤敏感词并替换成""的需求.想想很简单嘛,不就是把EditText的内容拿到,然后转换成char[], ...

  8. Go+PHP实现敏感词检测

    概述 广告,敏感词检测一直以来都是让人头疼的话题,仅仅通过添加敏感词列表是解决不了问题的.今天封禁了这个词,明天又会有新的违禁词冒出来,比起愚公无穷尽的子孙更甚. 敏感词匹配这种治标不治本的方法,在一 ...

  9. 【图解算法面试】记一次面试:说说游戏中的敏感词过滤是如何实现的?

    版权声明:本文为苦逼的码农原创.未经同意禁止任何形式转载,特别是那些复制粘贴到别的平台的,否则,必定追究.欢迎大家多多转发,谢谢. 小秋今天去面试了,面试官问了一个与敏感词过滤算法相关的问题,然而小秋 ...

最新文章

  1. HBase 1.2.6 完全分布式集群安装部署详细过程
  2. 方差分析的MATLAB实现(单因子)
  3. 映射文件xxx.hbm.xml下的各元素结构
  4. 更改oracle 端口,Oracle数据库11G R2 修改服务端口
  5. mysql安装主从配置_MySQL安装与主从配置
  6. Django first lesson 环境搭建
  7. java 关于日期的操作
  8. innodb下的mvcc_InnoDB的MVCC实现原理
  9. IPTV 质量评价方法已经不适用于 OTT TV 质量评价
  10. 利用python开发微信JS-JDK(基于python3.6)
  11. 【实验技术笔记】RNA 抽提 + 反转录PCR + PCR引物设计 + RT-qPCR
  12. python制作奖状,从excel表格中导出数据,取前20名,做成png奖状,再放入ppt中
  13. 物联网ARM开发高级
  14. Google Chrome谷歌浏览器清除缓存以及清除Cookie快捷键
  15. java 一元二次方程_java一元二次方程求根
  16. Kali linux 局域网arp断网攻击
  17. c语言四象限线性差值算法
  18. Wordpress 网站添加打赏插件
  19. 即席和即兴_即席和即兴_新员工参加会议,即兴发言赢得好感
  20. Matlab函数gscatter使用

热门文章

  1. struts2 文件上传为空
  2. 挣钱的好方法_在“星露谷”赚钱的5种方法
  3. 用jackson实现json和字符串直接的转换
  4. MD5、SHA1、CRC32值是干什么的?(转载)
  5. 2012年经济与股市战略
  6. 苹果系统引导修复工具_苹果客服渠道回应 iPhone 12 系列屏幕 “发绿”情况:将在新系统中修复...
  7. 工作!!工作!!!工作!!!!
  8. 使用mybatis-plus如何实现分页查询功能
  9. Windows程序设计入门教程[来自邪恶八进制信息安全团队(www.eviloctal.com)]
  10. 如何下载Mbtiles离线地图数据