dySE:一个Java搜索引擎的实现,第1部分 - 网络爬虫 - 编程入门网
er(htmlDoc);
String tempURL;
//初次匹配到的url是形如:<a href="http://bbs.life.xxx.com.cn/" target="_blank">
//为此,需要进行下一步的处理,把真正的url抽取出来,
//可以对于前两个"之间的部分进行记录得到url
while(matcher.find()){
try {
tempURL = matcher.group();
tempURL = tempURL.substring(tempURL.indexOf("\"") +1);
if(!tempURL.contains("\""))
continue;
tempURL = tempURL.substring(0, tempURL.indexOf ("\""));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
return allURLs;
}
按照“<[a|A]\\s+href=([^>]*\\s*>)”这个正则表达式可以匹配 出 URL 所在的整个标签,形如“<a href="http://bbs.life.xxx.com.cn/" target="_blank">”,所以在循环获得整个标签之后,需要进一步提取出真 正的 URL,我们可以通过截取标签中前两个引号中间的内容来获得这段内容。如 此之后,我们可以得到一个初步的属于该网页的 URL 集合。 接下来我们进行第二步操作,URL 的整理,即对之前获得的整个页面中 URL 集合进行筛选和整合。整合主要是针对网页地址是相对链接的部分,由于我们可 以很容易的获得当前网页的 URL,所以,相对链接只需要在当前网页的 URL 上 添加相对链接的字段即可组成完整的 URL,从而完成整合。另一方面,在页面中 包含的全面 URL 中,有一些网页比如广告网页是我们不想爬取的,或者不重要 的,这里我们主要针对于页面中的广告进行一个简单处理。一般网站的广告连接 都有相应的显示表达,比如连接中含有“ad”等表达时,可以将该链接的优先级 降低,这样就可以一定程度的避免广告链接的爬取。 经过这两步操作时候,可以把该网页的收集到的 URL 放入 URL 池中,接下 来我们处理爬虫的 URL 的派分问题。 Dispatcher 分配器 分配器管理 URL,负责保存着 URL 池并且在 Gather 取得某一个网页之后派 分新的 URL,还要避免网页的重复收集。分配器采用设计模式中的单例模式编码 ,负责提供给 Gather 新的 URL,因为涉及到之后的多线程改写,所以单例模式 显得尤为重要。 重复收集是指物理上存在的一个网页,在没有更新的前提下,被 Gather 重 复访问,造成资源的浪费,主要原因是没有清楚的记录已经访问的 URL 而无法 辨别。所以,Dispatcher 维护两个列表 ,“已访问表”,和“未访问表”。每 个 URL 对应的页面被抓取之后,该 URL 放入已访问表中,而从该页面提取出来 的 URL 则放入未访问表中;当 Gather 向 Dispatcher 请求 URL 的时候,先验 证该 URL 是否在已访问表中,然后再给 Gather 进行作业。 Spider 启动多个 Gather 线程 现在 Internet 中的网页数量数以亿计,而单独的一个 Gather 来进行网页 收集显然效率不足,所以我们需要利用多线程的方法来提高效率。Gather 的功 能是收集网页,我们可以通过 Spider 类来开启多个 Gather 线程,从而达到多 线程的目的。代码如下:
在开启线程之后,网页收集器开始作业的运作,并在一个作业 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |