1 题目要求
- 编写界面,输入一个网址,能够爬取该网址上所有的HTML源代码。
- 对网址中的文本进行提取。
- 建立敏感词库,用文本文件保存。
- 将该网址所对应的文本中的敏感词提取并高亮显示。
- 编写文本文件,可以存入多个网址;程序可爬取这些网址中的文本内容,将敏感词记录存入另一个文件,格式自定。
- 编写一个主界面,整合上述功能。
2 设计思路
- 采用JavaURL类连接网页网页。
- 爬取html代码:使用URLConection配合BufferedReader逐行读取html源代码。
- 提取网页文本:使用Java正则表达式匹配html源代码,过滤其中的标签等信息。
- 高亮显示敏感词:获取文本框中的Highlighter进行高亮显示,匹配到敏感词则进行高亮显示
- 爬取多个网址:分别爬取每个网址,统计每个网址中的敏感词数据,最后进行数据汇总,并将数据都写入文本中。
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 JP