经过程序代码将网页中咱们须要的文本信息批量、自动保存下来。html
若是不用框架,彻底咱们本身手写实现爬虫的功能,思路流程应该是怎样的?web
WebMagic框架就是作了上面流程的这些事,只须要咱们本身写解析网页html字符串和保存到数据库的逻辑就好了(由于每一个网页html字符串是不同的),其余的都帮咱们写好了。redis
WebMagic的内部实现也是生产者/消费者模式(后续的源码分析篇会看到) ,四个组件根据名称就能知道其大概功能:Downloader下载网页的,PageProcesser解析html字符串的,Pipeline写保存到数据库的逻辑,Scheduler生产者/消费者模式中的阻塞队列。
WebMagic的结构分为Downloader、PageProcessor、Scheduler、Pipeline四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。下面是官方给的架构图:数据库
网页下载器。将一个URL地址对应的网页HTML文本下载到本地来。为了提升下载效率,WebMagic在这一块设计成了多线程实现的方式。 多线程
能够继承HttpClientDownloader,将下载失败的URL保存到redis中。架构
页面处理器。对下载到本地的网页HTML文本进行分析,提取出咱们须要的文本。 并发
由于每一个网页的内容是不一样的,须要咱们自定义处理逻辑。框架
持久化操做。将提取出的文本保存到数据库或文件中。 dom
一样须要咱们自定义保存到数据库的逻辑。分布式
URL管理器。全部URL都会存到Scheduler中,它至关于一个保存URL字符串的容器,内置了使用set进行URL去重功能。当咱们须要爬取一个URL地址对应的网页时,就把这个URL推送到Scheduler中。下载器Downloader每次会从Scheduler中拉取出一个URL进行下载——典型的生产者/消费者模式。
由于须要分布式运行,因此须要咱们自定义基于redis保存URL的RedisScheduler类,能够参考官方源码webmagic-extension包中us.codecraft.webmagic.scheduler.RedisScheduler实现。
将四个组件串起来进行整个爬取流程的核心组件,也是整个流程的入口,每一个组件做为Spider的一个属性。
对请求的封装,也能够说是对URL的封装,内部还包含一个extraMap, 用于传递一些额外的辅助信息
对Downloader下载到的HTML页面的封装,从中能够获取到网页html文本,使用xpath解析dom提取出目标文本。
包裹从PageProcessor提取出来的数据,内部使用Map实现,用于PageProcessor和Pipeline之间的数据传递。
WebMagic将爬取网页的流程分解成多个组件,封装其中不变的成分,内部使用生产者/消费者模式实现爬虫批量、自动爬取网页的特性。