WebMagic使用小结

一、总体架构

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

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

WebMagic

WebMagic的四个组件

1、Downloader 负责下载页面

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

2、PageProcessor 负责解析页面

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

3、Scheduler 调度URL

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

4、Pipeline 持久化到文件/数据库等

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

一般Downloader和Scheduler不需要定制

流程核心控制引擎 -- Spider ,用来自由配置爬虫,创建/启动/停止/多线程等

用于数据流转的对象

1. Request

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

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

2. Page

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

3. ResultItems

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

官网详情:WebMagic官方中文文档

二、版本更迭差异

1、POST请求体

webMagic 0.7.0版本中移除了老的在request.extra中设置NameValuePair的方式,使用RequestBody 。

webMagic 0.7.0以下版本使用 Extra

Request request = new Request("");
request.setMethod(HttpConstant.Method.POST);
NameValuePair[] nameValuePair = new NameValuePair[](){
new BasicNameValuePair("id","100"),new BasicNameValuePair("tag","2")};

request.setExtra("nameValuePair", nameValuePair);
spider.addRequest(request);

webMagic 0.7.0以上版本使用 RequestBody

Request request = new Request("");
request.setMethod(HttpConstant.Method.POST);
request.setRequestBody(HttpRequestBody.json("{'id':1}","utf-8"));

2、POST去重

从0.6.2版本开始,POST默认不会去重,详情见:Issue 484。如果想要去重可以自己继承DuplicateRemovedScheduler,重写push方法。

爬虫遇到的Post请求基本没有,所以大家也不用担心。如果遇到了,自己继承DuplicateRemovedScheduler,重写push方法。

三、SpringBoot整合WebMagic

1、添加Maven依赖

    <dependency>
        <groupId>us.codecraft</groupId>
        <artifactId>webmagic-core</artifactId>
        <version>0.7.3</version>
    </dependency>
    <dependency>
        <groupId>us.codecraft</groupId>
        <artifactId>webmagic-extension</artifactId>
        <version>0.7.3</version>
    </dependency>

2、四个组件添加注解

  WebMagic各个组件加Spring的组件注解,通过注解的自动调用,便可以融入SpringBoot的使用特性。如果在Application中采用new 对象的方法进行爬取,则Autowired注解会失效。

四、WebMagic日志配置

  默认日志配置文件为log4j.properties,放在项目工程的resource文件下即可。

# 全局日志级别设定 ,file
log4j.rootLogger=INFO, stdout, file

# 自定义包路径LOG级别
log4j.logger.org.quartz=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{MM-dd HH:mm:ss}[%p]%m%n

# Output to the File
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=F:\\java\\SearchJobPlatform\\5-SearchJobPlatform\\webmagic.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%n%-d{MM-dd HH:mm:ss}-%C.%M()%n[%p]%m%n

警告1:无配置文件

将配置文件添加至resource文件夹下即可正常输出日志。

警告2:多版本绑定

  找到该jar包的来源,使用maven依赖树,探索该包的依赖关系,一路找下去,直至找到本工程直接写入的依赖。然后在该依赖下排除此jar包。

        <dependency>
            <!- 这是我自己建的一个包,朔源过程中第一个是它引入这个jar包-->
            <groupId>com.couragehe.souzhi</groupId>
            <artifactId>souzhi-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
            <exclusions>
                <exclusion>
                    <groupId>ch.qos.logback</groupId>
                    <artifactId>logback-classic</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>log4j-over-slf4j</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

五、源码分析进阶

爬虫框架Webmagic源码分析之Spider
爬虫框架WebMagic源码分析之Scheduler
爬虫框架WebMagic源码分析之Downloader
爬虫框架WebMagic源码分析之Selector
爬虫框架WebMagic源码分析之Selenium
WebMagic之Spider进阶