欢迎来到天天文库
浏览记录
ID:35786466
大小:30.76 KB
页数:18页
时间:2019-04-18
《搜索程序的简要编写好东西哦》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Java语言在此非常适合构建一个“蜘蛛”程序,其内建了对HTTP协议的支持,通过它可以传输大部分的网页信息;其还内建了一个HTML解析器,正是这两个原因使Java语言成为本文构建“蜘蛛”程序的首选。使用“蜘蛛”文章后面例1的示例程序,将会扫描一个网站,并寻找死链接。使用这个程序时需先输入一个URL并单击“Begin按”钮,程序开始之后,“Begin按”钮会变成“Cancel按”钮。在程序扫描网站期间,会在“Cancel按”钮之下显示进度,且在检查当前网页时,也会显示相关正常链接与死链接的数目,死链接将显示在程序底部的滚动文本框中。单击“Cancel按”钮会停止扫描过程,之后可以输入一个新的U
2、RL;如果期间没有单击“Cancel,”程序将会一直运行直到查找完所有网页,此后,“Cancel按”钮会再次变回“Begin,”表示程序已停止。下面将演示示例程序是如何与可复用“Spider类”交互的,示例程序包含在例1的CheckLinks类中,这个类实现了ISpiderReportable接口,如例2所示,正是通过这个接口,蜘蛛类才能与示例程序相交互。在这个接口中,定义了三个方法:第一个方法是“spiderFoundURL”,它在每次程序定位一个URL时被调用,如果方法返回true,表示程序应继续执行下去并找出其中的链接;第二个方法是“spiderURLError,”它在每次程序检测UR
3、L导致错误时被调用(如“404页面未找到”);第三个方法是“spiderFoundEMail,它”在每次发现电子邮件地址时被调用。有了这三个方法,Spider类就能把相关信息反馈给创建它的程序了。在begin方法被调用后,“蜘蛛”就开始工作了;为允许程序重绘其用户界面,“蜘蛛”是作为一个单独的线程启动的。点击“Begin按”钮会开始这个后台线程,当后台线程运行之后,又会调用“CheckLinks类”的run方法,而run方法是由Spider对象实例化时启动的,如下所示:spider=newSpider(this);spider.clear();base=newURL(url.getText(
4、));spider.addURL(base);spider.begin();首先,一个新的Spider对象被实例化,在此,需要传递一个“ISpiderReportable对象”给Spider对象的构造函数,因为“CheckLinks”实现了类“ISpiderReportable接”口,只需简单地把它作为当前对象(可由关键字this表示)传递给构造函数即可;其次,在程序中维护了一个其访问过的URL列表,而“clear方”法的调用则是为了确保程序开始时URL列表为空,程序开始运行之前必须添加一个URL到它的待处理列表中,此时用户输入的URL则是添加到列表中的第一个,程序就由扫描这个网页开始,并找
5、到与这个起始URL相链接的其他页面;最后,调用“begin方”法开始运行“蜘蛛”,这个方法直到“蜘蛛”工作完毕或用户取消才会返回。当“蜘蛛”运行时,可以调用由“ISpiderReportable接”口实现的三个方法来报告程序当前状态,程序的大部分工作都是由“spiderFoundURL”方法来完成的,当“蜘蛛”发现一个新的URL时,它首先检查其是否有效,如果这个URL导致一个错误,就会把它当作一个死链接;如果链接有效,就会继续检查它是否在一个不同的服务器上,如果链接在同一服务器上,“spiderFoundURL返”回true,表示“蜘蛛”应继续跟踪这个URL并找出其他链接,如果链接在另外的服
6、务器上,就不会扫描是否还有其他链接,因为这会导致“蜘蛛”不断地浏览Internet,寻找更多、更多的网站,所以,示例程序只会查找用户指定网站上的链接。构造Spider类前面已经讲了如何使用Spider类,请看例3中的代码。使用Spider类及“ISpiderReportable”接口能方便地为某一程序添加“蜘蛛”功能,下面继续讲解Spider类是怎样工作的。Spider类必须保持对其访问过的URL的跟踪,这样做的目的是为了确保“蜘蛛”不会访问同一URL一次以上;进一步来说,“蜘蛛”必须把URL分成三组,第一组存储在“workloadWaiting属性”中,包含了一个未处理的URL列表,“蜘蛛
7、”要访问的第一个URL也存在其中;第二组存储在“workloadProcessed中”,它是“蜘蛛”已经处理过且无需再次访问的URL;第三组存储在“workloadError中”,包含了发生错误的URL。Begin方法包含了Spider类的主循环,其一直重复遍历“workloadWaiting,并”处理其中的每一个页面,当然我们也想到了,在这些页面被处理时,很可能有其他的URL添加到“workloadWait
此文档下载收益归作者所有