Web Magic 总体架构

1.2 总体架构

WebMagic的结构分为DownloaderPageProcessorSchedulerPipeline四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic的设计参考了Scapy,但是实现方式更Java化一些。

而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。

WebMagic总体架构图如下:

image

1.2.1 WebMagic的四个组件

1.Downloader

Downloader负责从互联网上下载页面,以便后续处理。WebMagic默认使用了Apache HttpClient作为下载工具。

2.PageProcessor

PageProcessor负责解析页面,抽取有用信息,以及发现新的链接。WebMagic使用Jsoup作为HTML解析工具,并基于其开发了解析XPath的工具Xsoup。

在这四个组件中,PageProcessor对于每个站点每个页面都不一样,是需要使用者定制的部分。

3.Scheduler

Scheduler负责管理待抓取的URL,以及一些去重的工作。WebMagic默认提供了JDK的内存队列来管理URL,并用集合来进行去重。也支持使用Redis进行分布式管理。

除非项目有一些特殊的分布式需求,否则无需自己定制Scheduler。

4.Pipeline

Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等。WebMagic默认提供了“输出到控制台”和“保存到文件”两种结果处理方案。

Pipeline定义了结果保存的方式,如果你要保存到指定数据库,则需要编写对应的Pipeline。对于一类需求一般只需编写一个Pipeline

1.2.2 用于数据流转的对象

1. Request

Request是对URL地址的一层封装,一个Request对应一个URL地址。

它是PageProcessor与Downloader交互的载体,也是PageProcessor控制Downloader唯一方式。

除了URL本身外,它还包含一个Key-Value结构的字段extra。你可以在extra中保存一些特殊的属性,然后在其他地方读取,以完成不同的功能。例如附加上一个页面的一些信息等。

2. Page

Page代表了从Downloader下载到的一个页面——可能是HTML,也可能是JSON或者其他文本格式的内容。

Page是WebMagic抽取过程的核心对象,它提供一些方法可供抽取、结果保存等。在第四章的例子中,我们会详细介绍它的使用。

3. ResultItems

ResultItems相当于一个Map,它保存PageProcessor处理的结果,供Pipeline使用。它的API与Map很类似,值得注意的是它有一个字段skip,若设置为true,则不应被Pipeline处理。

1.2.3 控制爬虫运转的引擎--Spider

Spider是WebMagic内部流程的核心。Downloader、PageProcessor、Scheduler、Pipeline都是Spider的一个属性,这些属性是可以自由设置的,通过设置这个属性可以实现不同的功能。Spider也是WebMagic操作的入口,它封装了爬虫的创建、启动、停止、多线程等功能。下面是一个设置各个组件,并且设置多线程和启动的例子。详细的Spider设置请看第四章——爬虫的配置、启动和终止。

 1 public static void main(String[] args) {
 2     Spider.create(new GithubRepoPageProcessor())
 3             //从https://github.com/code4craft开始抓    
 4             .addUrl("https://github.com/code4craft")
 5             //设置Scheduler,使用Redis来管理URL队列
 6             .setScheduler(new RedisScheduler("localhost"))
 7             //设置Pipeline,将结果以json方式保存到文件
 8             .addPipeline(new JsonFilePipeline("D:\\data\\webmagic"))
 9             //开启5个线程同时执行
10             .thread(5)
11             //启动爬虫
12             .run();
13 }

 

1.2.4 快速上手

上面介绍了很多组件,但是其实使用者需要关心的没有那么多,因为大部分模块WebMagic已经提供了默认实现。

一般来说,对于编写一个爬虫,PageProcessor是需要编写的部分,而Spider则是创建和控制爬虫的入口。在第四章中,我们会介绍如何通过定制PageProcessor来编写一个爬虫,并通过Spider来启动。

转载于:https://www.cnblogs.com/thomas12112406/p/6560320.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372668.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

L1-006. 连续因子

一个正整数N的因子中可能存在若干连续的数字。例如630可以分解为3*5*6*7,其中5、6、7就是3个连续的数字。给定任一正整数N,要求编写程序求出最长连续因子的个数,并输出最小的连续因子序列。 输入格式: 输入在一行中给出一个正整数…

基于Java JAAS表单的身份验证

使用JAAS实现登录模块是一个高级主题,而且大多数开发人员也很少有机会参与这种开发。 但是JAAS登录模块的基本实现并不是那么困难,这是因为我打算将其发布。 在这里,我正在解释如何实现tomcat管理的身份验证模块。 此实现与容器无关。 我们可…

java自动投票代码,Java 投票(自动添一)

Java 投票(自动加一)数据库建立:SQL> create table vote(2 id number,3 name varchar(200),4 num number5 );//index.jsppageEncoding"utf-8"%>投票Connection conn1 null;Statement stmt1 null;ResultSet rs1 null;try {Class.forName("or…

SpringMVC搭建+实例

想做一点自己喜欢的东西,研究了一下springMVC,所以就自己搭建一个小demo,可供大家吐槽。 先建一个WEB工程,这个相信大家都会,这里不在多说。去网上下载spring jar包,然后在WEB-INF下新建一个lib文件,将下载的jar包放进…

Mockito和Hamcrest的试驾制造商

过去,很多人问我是否测试吸气剂和吸气剂(属性,属性等)。 他们还问我是否测试我的建筑商。 在我看来,答案取决于情况。 当使用遗留代码时,我不会费心去测试数据结构,这意味着对象只带有getter和s…

php8更新,PHP 8 中新特性以及重大调整

PHP 8,PHP 的一个新的大版本,预计将于2020年12月3日发布,这意味着将不会有 PHP 7.5 版本。PHP8目前正处于非常活跃的开发阶段,所以在接下来的几个月里,情况可能会发生很大的变化。在这篇文章中,我会维持一个…

Javascript学习之函数(function)

http://www.cnblogs.com/royalroads/p/4418587.html 在JS中,Function(函数)类型实际上是对象;每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。 一 函数的声明方式 //1.函数声…

jquery弹出可关闭遮罩提示框

jquery CSS3遮罩弹出层动画效果,使用非常简单,就两个标签,里面自定义内容和样式,四种常见效果,懂的朋友还可以修改源代码修改成自己想要的效果效果展示 http://hovertree.com/texiao/jquery/85/代码如下: &…

用于Spring JPA2后端的REST CXF

在本演示中,我们将使用spring / jpa2后端生成一个REST / CXF应用程序。 该演示演示了分钟项目的轨迹REST-CXF 。 演示2中的模型保持不变。 浓缩保持不变。 但是轨道改变了 添加的是2层: 在JPA2之上具有弹簧集成的DAO层 具有JAX-RS批注的REST-CXF层…

php与服务器关系,php与web服务器关系

1.什么是cgi程序,cgi与fastcgi的区别CGI的中文名称是通用网关接口,是外部应用程序与web服务器之间的接口标准。CGI规范允许web服务器执行外部程序,并将它们的输出发送给web浏览器。而fastcgi则是一个常驻型的cgi,它可以一直执行着…

POJ 3468 A Simple Problem with Integers(线段树:区间更新)

http://poj.org/problem?id3468 题意: 给出一串数,每次在一个区间内增加c,查询[a,b]时输出a、b之间的总和。 思路: 总结一下懒惰标记的用法吧。 比如要对一个区间范围内的数都要加c,在找到这个区间之后,本…

php 新浪url,PHP URL函数详解

php url函数:parse_url()parse_url(PHP 3, PHP 4, PHP 5)parse_url -- 解析 URL,归来其构成局部解释array parse_url ( string url )本函数解析一个 URL 并归来一个关系数组,包括在 URL 中揭示的各种构成局部。本函数不是用来检讨给定 URL 的合法性的&am…

完整的WebApplication JSF EJB JPA JAAS –第1部分

这篇文章将是迄今为止我博客中最大的一篇文章! 我们将看到完整的Web应用程序。 最新的技术将完成此工作(直到今天),但是我将给出一些提示以显示如何使本文适用于较旧的技术。 在本文的结尾,您将找到要下载的源代码。 您…

Ajax和JavaScript的区别

javascript是一种在浏览器端执行的脚本语言,Ajax是一种创建交互式网页应用的开发技术 ,它是利用了一系列相关的技术其中就包括javascript。Javascript是由网景公司开发的一种脚本语言,它和sun公司的java语言是没有任何关系的,它们…

大一

以后准备开始ACM的题目啦转载于:https://www.cnblogs.com/Aiden-/p/6562038.html

概念验证:玩! 构架

我们正在开始一个新项目,我们必须选择Web框架。 我们的默认选择是grails,因为团队已经拥有使用它的经验,但是我决定给Play! 和Scala有机会。 玩! 有很多很酷的东西,在我的评估中,它得到了很多加…

ldap统一用户认证php,针对LDAP服务器进行身份认证

Symfony提供了不同的方法来配合LDAP服务器使用。Security组件提供:ldap user provider,使用的是form_login_ldap authentication provider,用于针对一台使用了表单登录的LDAP服务器。同所有其他user provider一样,它可以同任何aut…

每天CookBook之JavaScript-039

IIFE的使用<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>039</title> </head> <body></body> <script type"text/javascript"> (function () {var i 0;fu…

Day-6:创建计算字段

字段&#xff1a;基本上与列的意思相同&#xff0c;经常互换使用&#xff0c;计算字段是运行时在SELECT语句内创建的&#xff0c;不实际存在于数据库表中。 拼接字段&#xff1a;将值联结到一起构成单个值 SQL中的SELECT语句中可以使用或||操作符拼接&#xff0c;但mysql中必须…

使用Hibernate加载或保存图像-MySQL

本教程将引导您逐步了解如何使用Hibernate从数据库&#xff08; MySQL &#xff09;保存和加载图像。 要求 对于此示例项目&#xff0c;我们将使用&#xff1a; Eclipse IDE &#xff08;您可以使用自己喜欢的IDE&#xff09;&#xff1b; MySQL &#xff08;您可以使用任何…