返回介绍

1.2 总体架构

发布于 2019-11-28 05:27:14 字数 3249 浏览 977 评论 0 收藏 0

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 设置请看第四章—— 爬虫的配置、启动和终止

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

1.2.4 快速上手

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文