• 用Java编程实现“网络蜘蛛”
  • 发表时间:2008-08-27 11:02:57 点击:30
  • 使用“蜘蛛”
    文章后面例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
上一篇 如何在Java程序中实现FTP的上传下载功能   下一篇 Java开发应用软件JCreator的使用技巧介绍
  • 课程名称
  • 开课时间
  • 学校名称
  • 原价
  • 优惠价
    高级搜索
    • 选择区域
    • 课程类别
    • 开课时间
    • 结束时间
    • 课程名称
    • 学校名称
    • 价格范围 至:
    赞助商链接
    热门推荐
  • Copyright © 2007-2008 [ 南京首屏信息技术有限公司 ] Houxue.com All rights reserved.苏ICP备08001743号
  • 咨询电话:025-84767067,84767068,84767069,84767070,52219232(三山街店),84586200(光华门店)
  • 关于厚学网 | 友情链接 | 联系我们