webmagic笔记
在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也就介绍完成了。以后会就每个模块分别进行介绍的。
webmagic笔记的更多相关文章
- Java网络爬虫笔记
Java网络爬虫笔记 HttpClient来代替浏览器发起请求. select找到的是元素,也就是elements,你想要获取具体某一个属性的值,还是要用attr("")方法.标签 ...
- git-简单流程(学习笔记)
这是阅读廖雪峰的官方网站的笔记,用于自己以后回看 1.进入项目文件夹 初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: 第一步,使用命令git add <file ...
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- SQL Server技术内幕笔记合集
SQL Server技术内幕笔记合集 发这一篇文章主要是方便大家找到我的笔记入口,方便大家o(∩_∩)o Microsoft SQL Server 6.5 技术内幕 笔记http://www.cnbl ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- NET Core-学习笔记(三)
这里将要和大家分享的是学习总结第三篇:首先感慨一下这周跟随netcore官网学习是遇到的一些问题: a.官网的英文版教程使用的部分nuget包和我当时安装的最新包版本不一致,所以没法按照教材上给出的列 ...
- springMVC学习笔记--知识点总结1
以下是学习springmvc框架时的笔记整理: 结果跳转方式 1.设置ModelAndView,根据view的名称,和视图渲染器跳转到指定的页面. 比如jsp的视图渲染器是如下配置的: <!-- ...
- 读书笔记汇总 - SQL必知必会(第4版)
本系列记录并分享学习SQL的过程,主要内容为SQL的基础概念及练习过程. 书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL i ...
随机推荐
- sqlserver 大数据量的insert、delete操作优化
http://blog.csdn.net/lanyuzhen/article/details/7547476 --大批量导出orders表:insert DBCC DROPCLEANBUFFERS ...
- SQL优化系列(三)- 用最少的索引获得最大的性能提升
从全局出发优化索引 对于高负载的数据库,如何创建最少的索引,让数据库的整体性能提高呢?例如,对于100 条SQL语句,如何创建最佳的5条索引? SQL自动优化工具SQL Tuning Expert P ...
- [J2EE规范]JDBC简单例子 标签: 数据库j2eejdbcjava 2017-06-29 10:55 353人阅读 评论(12)
JDBC是什么? JDBC是java数据库连接(Java Database Connectivity),它是用于java编程语言和数据库之间的数据库无关连接的标准Java API,就是说,JDBC是用 ...
- CentOS 上MySQL报错Can't connect to local Mysql server through socket '/tmp/mysql.scok' (111)
好吧,这是最常见的MySQL服务没有打开 那就赶紧去打开啊! 在管理员模式下运行以下语句: /usr/local/mysql/bin/mysqld_safe --user=mysql & 成功 ...
- php实现希尔排序
对于排序的算法我想大家首先想到的事 冒泡排序:快速排序:或者想起选择和插入排序: 今天的讲解并不是以上四种:而是希尔排序: 对18W个数字排序,时间比较(毫秒) 希尔排序 0.1s 就完成了,有点不 ...
- BigDecimal创建初始化值类型对比
当初始化String类型和double类型,入参值相同,对比输出值 BigDecimal bigDecimalStr = new BigDecimal("0.1"); BigDec ...
- oracle-Expdp/impdp命令
建立逻辑路径 create or replace directory dumpdir as 'c:\'; grant read,write on directory dumpdir to scott; ...
- vuxdemo1
//main.js import Vue from 'vue' import router from './router' import store from './store' import axi ...
- css 的float和inline-block区别
CSS布局创建网站,浮动绝对占据了很大的比例.大块区域如主内容及侧边栏,以及在其中的小块区域,都可以看到浮动的影子.这里浮动是唯一的解决方案吗? 浮动通常表现正常,但有时候搞起来会很纠结.特别是处理内 ...
- poj3308 最小割
因为行可以了,那列就不行,所以根据行列建立最小割模型. 然后这题精妙之处在于把乘法取对数后转化为加法,瞬间就简单了. 保证精度,C++AC ,16MS G++WA. #include<stdio ...