在class Spider中有run函数,调用了 processRequest(requestFinal)完成对页面的下载和处理。在这个函数里面先调用downloader.download(request, this);完成页面的下载, pageProcessor.process(page);完成对页面的处理过程,随后可以进行抽取结果的持久的过程。爬虫下载页面以及后续处理的大致过程,我现在要分析的主要是页面的处理过程!
pageProcessor.process()这个函数需要用户自己来定义,这里主要涉及HTML这个类,这个类完成了对页面的处理。HTML继承自htmlnode,htmlnode则继承自abstractselectable,abstractselectable则是实现了selectable接口。
selectable中有若干函数,用于实现对结果的抽取。主要还是要看HTML这个类,虽然这个类有多个构造函数,但是下载页面后将下载的内容转换为HTML的时候调用的是 Html(String text) ,然后调用 this.document = Jsoup.parse(text);用jsoup来解析这个string类型的HTML。在这个类中实现了对页面的解析,当然类中调用了之前已经定义的多个选择器!思绪有点乱,暂时这样!
今天要学习一下webmagic中的pipeline模块。
首先是有一个接口: interface Pipeline 接口中提供了一个方法: public void process(ResultItems resultItems, Task task);处理resultitem中存取的结果。同时还有一个接口:
interface CollectorPipeline<T> extends Pipeline,这个接口继承了Pipeline接口,同时有方法: public List<T> getCollected();返回一个 List<T> 结果。
接口介绍完了,我们看一下实现类:其中最简单的是public class ConsolePipeline implements Pipeline,这个类是实现控制台的输出,就是将resultItems 直接输出到控制台就可以了。
下一个要介绍的是public class ResultItemsCollectorPipeline implements CollectorPipeline<ResultItems>,ResultItemsCollectorPipeline这个类实现了CollectorPipeline接口,他的主要功能就是将ResultItems放到List<ResultItems> collector中并且可以返回collector。
在介绍下面几个类之前,需要先了解一下public class FilePersistentBase这个类,其他基于文件的持久化的功能都是继承了这个类。这个类的主要目的就是:创建文件目录,为实现后面的具体的各种形式的文件打个基础。
class JsonFilePipeline extends FilePersistentBase implements Pipeline和class FilePipeline extends FilePersistentBase implements Pipeline分别是以json和HTML文件形式来保存结果。
这里来记录一下scheduler模块
介绍这个模块之前先要介绍一下scheduler.component模块
DuplicateRemover是接口,接口函数有 public boolean isDuplicate(Request request, Task task);和public void resetDuplicateCheck(Task task);以及public int getTotalRequestsCount(Task task);
实现它的类有:HashSetDuplicateRemover 和 BloomFilterDuplicateRemover其中HashSetDuplicateRemover 中是以Sets.newSetFromMap来判断是否重复。BloomFilterDuplicateRemover 使用BloomFilter<CharSequence>来去重。scheduler.component模块实现了对抓取URL的保存。
下面我们看一下scheduler模块
首先是接口interface Scheduler 接口函数有: public void push(Request request, Task task); public Request poll(Task task);这个接口就是获得和添加待爬取的URL,同时还有接口继承了这个接口:interface MonitorableScheduler extends Scheduler 接口中的函数有: public int getLeftRequestsCount(Task task); public int getTotalRequestsCount(Task task);MonitorableScheduler接口是提供监控功能,也就是查看还剩下多少待爬取的URL,和总共有多少URL。下面介绍实现类:
实现类都是实现了接口同时还继承了abstract class DuplicateRemovedScheduler,DuplicateRemovedScheduler同时也是实现了接口Scheduler 。DuplicateRemovedScheduler 使用了DuplicateRemover作为他的成员,同时留下了待实现的两个函数 boolean shouldReserved(Request request),和 void pushWhenNoDuplicate(Request request, Task task) ,他实现了接口 Scheduler 中的函数push(Request request, Task task)。只有满足结果URL中不含有待抓取的URL和shouldReserved(request)这两个条件的时候,才会调用 pushWhenNoDuplicate(request, task),这样函数应该是将URL放到结果URL中去。
class QueueScheduler extends DuplicateRemovedScheduler implements MonitorableScheduler用LinkedBlockingQueue实现了存放待抓取的URL,getLeftRequestsCount就是返回队列中的URL的数量,getTotalRequestsCount则是返回用于去重的结果URL中的数量。PriorityScheduler extends DuplicateRemovedScheduler implements MonitorableScheduler 用了LinkedBlockingQueue<Request>,PriorityBlockingQueue<Request> priorityQueuePlus和 PriorityBlockingQueue<Request>priorityQueueMinus 用来暂时的存放待抓取的URL。分别存放的是没有设置优先级,也就是getPriority()结果返回值为0,>0和<0的三种URL。到这里scheduler也就介绍完成了。以后会就每个模块分别进行介绍的。