笔者最近发现偶然发现一个非常友好的java爬虫框架,感觉非常适合用来java代码以及爬虫知识的学习,随通过查阅网上资料以及阅读其官方手册,并且分析其源代码,学习到了非常多的有用知识,包括java开发的基本哲学,面向对象的知识,设计模式,当然最重要的还是爬虫开发的一系列知识。本篇作为源代码webmagic的开篇,主要聊一聊其框架的整体结构以及其关键的核心代码。
0xo0:什么是爬虫🕷
简单来讲,爬虫是通过程序自动的从网络上抓取特定的url并且从获得的html(通常情况下)分析出我们感兴趣的内容。也就是说爬虫可以大致分为两个步骤:1、抓取(下载)url,2、分析下载到的内容。当然这是一个极度简化的步骤,但是足以说明爬虫的工作原理了。
0x01:webmagic的整体分析🕷
这里是webmagic框架的官方介绍:WebMagic的结构分为Downloader
、PageProcessor
、Scheduler
、Pipeline
四大组件,并由Spider将它们彼此组织起来。这四大组件对应爬虫生命周期中的下载、处理、管理和持久化等功能。WebMagic的设计参考了Scapy,但是实现方式更Java化一些。
而Spider则将这几个组件组织起来,让它们可以互相交互,流程化的执行,可以认为Spider是一个大的容器,它也是WebMagic逻辑的核心。
WebMagic总体架构图如下:
从示意图上我们大致可以看出:
- Downloader负责下载功能,其输入是Request,输出是Page。由于download是从互联网上获取内容,因此他是io密集型的程序。并且他实际上承担着生产者和消费者双重身份,消费Request,生产Page。
- PageProcessor负责页面的处理功能。具体来说,一般是分析页面,抽取感兴趣的内容,以及发现新的url。其输入是Page,输出是Request。由于PageProcessor是对文本页面进行分析,设计到复杂的操作,因此他是cpu密集型的程序。而且他也承担着生产者和消费者的双重身份。和Downloader正好相反,消费Page,生产Request。需要注意的是,这部分是爬虫开发者必须实现的类,也是创建爬虫的必选参数。
- Scheduler则负责协调PageProcessor和Downloader。通过对Request的管理,来实现对两者的管理。原理类似于通过阻塞队列来同步生产者和消费者。这里涉及大量的多线程知识,待后续博客详细讲解。
- Pipeline则是对持久化的抽象。一种持久化手段对应一个PipeLine类。包括将结果持久化到文件、数据库或者直接打印到屏幕。
下面通过一段代码直观感受Spider的使用:
public class ZhihuPageProcessor implements PageProcessor {
private Site site = Site.me().setRetryTimes(3).setSleepTime(1000);
@