前面已经讲了如何使用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<list.length)&&!cancel;i++ ) processURL((URL)list[i]); }
当上述代码遍历“workloadWaiting”时,它把每个需处理的URL都传递给“processURL”方法,而这个方法才是真正读取并解析URL中HTML信息的。