天津大学2007届本科生毕业设计(论文)
url_C.setReadTimeout(10000);
3.用输入流,BufferedReader读取,并且将网页内容存储为字符串。
4.2.2 分析网页
继承ParserCallback获得网页内容
// 得到标题文本
protected String urlTitle = new String(); // 得到某一网页上的所有链接
protected Vector
protected String paragraphText = new String(); protected String linkandparagraph = new String(); protected String encode = new String(); public Parser(String baseurl) { }
public String getEncode() { }
// 获得该网页标题
public String getURLtitle() { }
// 获得该网页的所有链接 public Vector getLinks() { }
// 获得所有该网页的链接名 public Vector getLinkName() // 获得网页正文
public String getParagraphText()
public void handleEndTag(HTML.Tag t, int pos) // 处理简单标签
return links; return urlTitle; return encode; base = baseurl;
15
天津大学2007届本科生毕业设计(论文)
public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int
pos)
// 处理结束标签
之后通过调用HTMLEditorKit.Parser类,生成对象就可以直接得到分析后的网页文件。
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int // 处理文本 标签
public void handleText(char[] data, int pos) pos)
4.2.3 判断相关度
算法实现步骤和算法描述:
1.对标题及正文的特征项的选取是通过分词后与主题集合匹配,并通过词频计算来得到与主题向量维数相等的标题向量和正文向量。 2.通过向量空间模型计算出主题和标题的相关度B。 3.通过空间向量向量模型计算主题与正文的相关度C。 4.主题与整个网页的相关度:A=4×B+C。
5.通过详细计算,设定相关度阈值为2,网页与主题的相关度A>2,则认为该网页与主题相关的。
输入:主题集合文本a.txt,网页url 输出:主题相关度
(1)Get topic(String path)//根据路径获取主题文本集合 (2)Compulate topicweight(String topic)//求主题结合权重
(3)sortAndDelRepeat(int[]count)//删除重复元素并排序 (4)delRepeat(String[] segment)//删除分词后的重复元素 (5)delRepeat(Vector url)//删除得到的URL中的重复元素 (6)getParser(String url)//获得Parser实例
(7)String titleStr =p.getURLtitle()//获取网页标题 (8)String bodyStr=p.getParagraphText()//获取网页文本
(9)String titleStrSeg=segment.segment(titleStr)//网页标题分词 (10)String bodyStrSeg=segment.segment(bodyStr)//网页文本分词 (11)Compulate title.length,body.length//计算标题向量长度和网页
16
天津大学2007届本科生毕业设计(论文)
文本向量长度
(12)set topicweight1,titleweight1,bodyweight1;//设置权重 (13)Last compulate Relative//计算主题相关性 (14)Return relative;//返回结果
根据系统设置首先是下载所有网页,而后判定主题相关性,与主题相关则放置在相关URL库中,不相关的网页则丢弃。
4.2.4 保存网页信息
1.首先建立URL连接。
URLConnection url_C = url_test.openConnection(); 2.新建PagePro类。如下: private String Host; private int Port;
private String ContentType; private int ContentLength; private String Date; private String Url;
3.将数据存入新建的PagePro类中。 4.将数据保存到预先输入的地址。
4.2.5 数据库设计和存储
使用JDBC访问数据库,储存下载的网页URL和下载时间信息。
4.2.6 多线程的实现
设计为4个线程同时进行工作。
1. 从用户输入的起始URL开始,递归获得指定深度的URL。 2. 对每个URL进行分析,判断相关度。 3. 下载与主题相关的网页,并存储在数据库中。
第i个线程对所有URL列表中序列为第0+4i URL的进行同步操作,其中对储存所有URL的列表执行synchronized (all_URL)操作。
17
天津大学2007届本科生毕业设计(论文)
4.2.7 附加功能
为了检测网络环境,防止因为不良的网络环境影响网络爬虫的爬取效率和正确略,额外添加了实时的ping功能,调用windows的命令解释器的ping功能,测试用户输入网址与当前主机的连接状况,测试当前网络状况是否良好。
4.2.8 整体流程
爬虫代码文件构成如图4-1:
图4-1 代码结构构成截图
HtmlParser.java这个类是改写HTMLEditorKit.Parser getParser()方法为public
HTTP.java是根据输入URL获取网页文档
Parser.java是继承ParserCallback获得网页内容 Relative.java是判断主题与网页内容的相关性 Segment.java是对网页主题和正文进行分词
18
天津大学2007届本科生毕业设计(论文)
Download.java是下载网页所用,Pagepro.java是为Download.java生成存储对象。
JDBCTest.java对数据库进行操作 mainF.java整合了网络爬虫的功能 Ui.java是界面
Ping.java是调用Ping程序的类 具体流程:
第一步: 调用HtmlParser.java,Parser.java,获得起始URL的内容,并存储到String中。
第二步:调用Parser.java获得网页下面所有的URL,同时去除重复的部分。 第三步:对以上两步进行递归循环,获得指定深度的所有URL列表。 第四步:调用Relative.java,Segment.java得到每个URL对应的网页内容与给定主题的阈值,大于给定值则相关,小于给定值则不相关,丢弃该URL。
第五步:调用Download.java和JDBCTest.java将与主题相关的网页下载并存储入数据库。
19