用Java编程实现"网络蜘蛛"[Java编程]
本文“用Java编程实现"网络蜘蛛"[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
简介
“网络蜘蛛”大概说“网络爬虫”,是一种能拜候网站并跟踪链接的程序,通过它,可快速地画出一个网站所包含的网页地图信息.本文主要报告若何利用Java编程来构建一个“蜘蛛”,我们会先以一个可复用的蜘蛛类包装一个基本的“蜘蛛”,并在示例程序中演示若何成立一个特定的“蜘蛛”来扫描相关网站并找出死链接.
Java语言在此非常合适构建一个“蜘蛛”程序,其内建了对HTTP协议的支持,通过它可以传输大部份的网页信息;其还内建了一个HTML解析器,恰是这两个缘由使Java语言成为本文构建“蜘蛛”程序的首选.
利用“蜘蛛”
文章背面例1的示例程序,将会扫描一个网站,并探求死链接.利用这个程序时需先输入一个URL并单击“Begin”按钮,程序开始之后,“Begin”按钮会变成“Cancel”按钮.在程序扫描网站期间,会在“Cancel”按钮之下显示进度,且在查抄当前网页时,也会显示相关正常链接与死链接的数目,死链接将显示在程序底部的转动文本框中.单击“Cancel”按钮会终止扫描历程,之后可以输入一个新的URL;假如期间没有单击“Cancel”,程序将会一向运行直到查找完好部网页,此后,“Cancel”按钮会再次变回“Begin”,表示程序已终止.
下面将演示示例程序是若何与可复用“Spider”类交互的,示例程序包含在例1的CheckLinks类中,这个类实现了ISpiderReportable接口,如例2所示,恰是通过这个接口,蜘蛛类才能与示例程序相交互.在这个接口中,定义了三个办法:第一个办法是“spiderFoundURL”,它在每次程序定位一个URL时被调用,假如办法返回true,表示程序应持续履行下去并找出此中的链接;第二个办法是“spiderURLError”,它在每次程序检测URL招致错误时被调用(如“404 页面未找到”);第三个办法是“spiderFoundEMail”,它在每次发现电子邮件地址时被调用.有了这三个办法,Spider类就可以把相关信息反馈给成立它的程序了.
在begin办法被调用后,“蜘蛛”就开始工作了;为答应程序重绘其用户界面,“蜘蛛”是作为一个单独的线程启动的.点击“Begin”按钮会开始这个后台线程,当后台线程运行之后,又会调用“CheckLinks”类的run办法,而run办法是由Spider对象实例化时启动的,以下所示:
spider = new Spider(this);
spider.clear();
base = new URL(url.getText());
spider.addURL(base);
spider.begin();
首先,一个新的Spider对象被实例化,在此,需求传送一个“ISpiderReportable”对象给Spider对象的构造函数,因为“CheckLinks”类实现了“ISpiderReportable”接口,只需简单地把它作为当前对象(可由关键字this表示)传送给构造函数便可;其次,在程序中保护了一个其拜候过的URL列表,而“clear”办法的调用则是为了确保程序开始时URL列表为空,程序开始运行之前必须增添一个URL到它的待处理列表中,此时用户输入的URL则是增添到列表中的第一个,程序就由扫描这个网页开始,并找到与这个起始URL相链接的其他页面;最后,调用“begin”办法开始运行“蜘蛛”,这个办法直到“蜘蛛”工作完毕或用户撤消才会返回.
当“蜘蛛”运行时,可以调用由“ISpiderReportable”接口实现的三个办法来报告程序当前状况,程序的大部份工作都是由“spiderFoundURL”办法来完成的,当“蜘蛛”发现一个新的URL时,它首先查抄其能否有效,假如这个URL招致一个错误,就会把它当作一个死链接;假如链接有效,就会持续查抄它能否在一个差别的服务器上,假如链接在同一服务器上,“spiderFoundURL”返回true,表示“蜘蛛”应持续跟踪这个URL并找出其他链接,假如链接在别的的服务器上,就不会扫描能否还有其他链接,因为这会招致“蜘蛛”不断地浏览Internet,探求更多、更多的网站,所以,示例程序只会查找用户指定网站上的链接.
构造Spider类
前面已经讲了若何利用Spider类,请看例3中的代码.利用Spider类及“ISpiderReportable”接口能便利地为某一程序增添“蜘蛛”功效,下面持续讲授Spider类是怎样工作的.
Spider类必须保持对其拜候过的URL的跟踪,这样做的目的是为了确保“蜘蛛”不会拜候同一URL一次以上;进一步来说,“蜘蛛”必须把URL分成三组,第一组存储在“workloadWaiting”属性中,包含了一个未处理的URL列表,“蜘蛛”要拜候的第一个URL也存在此中;第二组存储在“workloadProcessed”中,它是“蜘蛛”已经处理过且无需再次拜候的URL;第三组存储在“workloadError”中,包含了发生错误的URL.
Begin办法包含了Spider类的主循环,其一向反复遍历“workloadWaiting”,并处理此中的每一个页面,当然我们也想到了,在这些页面被处理时,极大概有其他的URL增添到“workloadWaiting”中,所以,begin办法一向持续此历程,直到调用Spider类的cancel办法,或“workloadWaiting”中已不再剩有URL.这个历程以下:
cancel = false;
while ( !getWorkloadWaiting().isEmpty() && !cancel ) {
Object list[] = getWorkloadWaiting().toArray();
for ( int i=0; (i
processURL((URL)list[i]);
}
当上述代码遍历“workloadWaiting”时,它把每个需处理的URL都传送给“processURL”办法,而这个办法才是真正读取并解析URL中HTML信息的.
读取并解析HTML
Java同时支持拜候URL内容及解析HTML,而这恰是“processURL”办法要做的.在Java中读取URL内容相对还对比简单,下面就是“processURL”办法实现此功效的代码:
URLConnection connection = url.openConnection();
if ( (connection.getContentType()!=null) &&
!connection.getContentType().toLowerCase()
.startsWith("text/") ) {
getWorkloadWaiting().remove(url);
getWorkloadProcessed().add(url);
log("Not processing because content type is: " +
connection.getContentType() );
return;
}
以上是“用Java编程实现"网络蜘蛛"[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |