在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也就介绍完成了。以后会就每个模块分别进行介绍的。

最新文章

  1. JavaScript面向对象程序设计:数组
  2. ajax异步验证用户名密码,提示路径错误
  3. crossplatform---Nodejs in Visual Studio Code 06.新建Module
  4. Yii2学习笔记之场景
  5. spark standalone zookeeper HA部署方式
  6. ExtJS4.x 开发环境搭建
  7. Jmeter正则表达式提取器的使用方法(转)
  8. UVa 12304 (6个二维几何问题合集) 2D Geometry 110 in 1!
  9. poj 2184 Cow Exhibition
  10. [功能帮助类] C#取汉字拼音的首字母PinYin帮助类 (转载)
  11. Entify Framewrok - 学习链接
  12. JavaScript判断变量数据类型
  13. Oracle中的游标
  14. treeview树(利用数据表实现)带展开
  15. UI命名规范
  16. 英语笔记3(git)
  17. 在 Tomcat 中自定义 404 页面(简单配置)
  18. Oracle SQL 优化规则
  19. nmap - 网络扫描
  20. openvpn之EasyRSA配置篇

热门文章

  1. IUAP--单点登录
  2. python ndarray相关操作:拼接
  3. CentOS下重启uwsgi
  4. Contentprovider 注册 启动简单流程
  5. LeetCode169 Majority Element, LintCode47 Majority Number II, LeetCode229 Majority Element II, LintCode48 Majority Number III
  6. Python 模块chardet安装过程(windows环境)
  7. poj2125 最小点权覆盖集
  8. 获取登录的地点和ip地址的js
  9. JAVA高级特性--String/StringBuffer/Builder
  10. Python学习之路10☞面向对象进阶