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 ...
随机推荐
- Direct2D 第5篇 绘制图像
原文:Direct2D 第5篇 绘制图像 我加载的图像是一张透明底PNG图像,背景使用渐变的绿色画刷 #include <windows.h> #include <d2d1.h> ...
- 利用Eclipse进行远程Debug
这项功能真的十分赞,当我不想写junit test,又想调试在实际环境中才能起作用的Java程序,远程debug真的是太好用了. 参数:java -jar -Xdebug -Xrunjdwp:tran ...
- Qt添加右键菜单
QAction *hideAction = new QAction(tr(" 隐藏"),this); addAction(hideAction); setContextMenuPo ...
- C++的替代运算标记符
标记符and, and_eq, bitand, bitor, compl, not, not_eq, or, or_eq, xor, xor_eq, <%, %>, <: 和 :&g ...
- database homework1
mysql> select * from teacher_info; +----+------+-----+--------+---------+ | id | name | age | sal ...
- Directx11教程(20) 一个简单的水面
原文:Directx11教程(20) 一个简单的水面 nnd,以前发的这篇教程怎么没有了?是我自己误删除了,还是被系统删除了? 找不到存稿了,没有心情再写一遍了. 简单说一下,本篇教程就是实 ...
- DHCP服务器安装、测试
df:disk free df -h 查询空余磁盘 find / -name TechSungWeiXin 查询TechSungWeiXin的位置 find / -name YunyueWeixin_ ...
- 2019-10-26-Inno-Setup-安装包脚本-Run-的-Flags-标记
title author date CreateTime categories Inno Setup 安装包脚本 Run 的 Flags 标记 lindexi 2019-10-26 08:42:39 ...
- Leetcode824.Goat Latin山羊拉丁文
给定一个由空格分割单词的句子 S.每个单词只包含大写或小写字母. 我们要将句子转换为 "Goat Latin"(一种类似于 猪拉丁文 - Pig Latin 的虚构语言). 山羊拉 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第六章:在Direct3D中绘制 代码工程地址: https://gi ...