springboot 2.0集成webmagic(低配置,自动化采集)(上)

简介: springboot 2.0集成webmagic(低配置,自动化采集)(上)

正文


一、职责链模式


介绍


顾名思义,职责链模式是为请求创建一个接收者对象的链,对请求的发送者和接收者进行解耦。


举个例子,比如说,公司请假,根据请假时长不同,递交到公司领导的级别也不一样,这种层级递交的关系就是一种链式结构


实现


创建抽象类AbstractArticleHandler,创建两种类型的文章处理类,都扩展了AbstractArticleHandler,每个文章处理类都有自己的逻辑,通过文章类型判断,如果是则执行相应文章处理类,否则把消息传给下一个文章处理类


444.png


步骤1


创建抽象的文章处理类


public abstract class AbstractArticleHandler {
    /**
     * 下一个处理者
     */
    private AbstractArticleHandler abstractArticleHandler;
    /**
     * 获取articleType
     * @return
     */
    protected abstract ArticleTypeEnum getArticleTypeEnum();
    /**
     * 拉取文章
     * @param uris 链接数组
     * @return
     */
    protected abstract void articlePull(String[] uris);
    public final void handlerArticle(final List<String> links,final String articleType) {
        if (this.getArticleTypeEnum().getValue().equals(articleType)) {
            this.articlePull(links.toArray(new String[links.size()]));
        } else {
            if (this.abstractArticleHandler != null) {
                this.abstractArticleHandler.handlerArticle(links, articleType);
            }
        }
    }
    public void setNext(AbstractArticleHandler abstractArticleHandler) {
        this.abstractArticleHandler = abstractArticleHandler;
    }
}
enum ArticleTypeEnum {
    CSDN("csdn"),
    BKY("bky");
    private final String value;
    ArticleTypeEnum(String value) {
        this.value = value;
    }
    public String getValue() {
        return value;
    }
}


步骤2


创建扩展文章处理类


public class CsdnArticleHandler extends AbstractArticleHandler{
    @Override
    protected ArticleTypeEnum getArticleTypeEnum() {
        return ArticleTypeEnum.CSDN;
    }
    @Autowired
    private PipelineObserver pipelineObserver;
    @Override
    protected void articlePull(String[] uris) {
    }
}


public class BkyArticleHandler extends AbstractArticleHandler{
    @Override
    protected ArticleTypeEnum getArticleTypeEnum() {
        return ArticleTypeEnum.BKY;
    }
    @Override
    protected void articlePull(String[] uris) {
    }
}


步骤3


添加文章处理器,形成链式调用


public class ArticleService {
    public static void main(String[] args) {
        AbstractArticleHandler a1 = new CsdnArticleHandler();
        AbstractArticleHandler a2 = new BkyArticleHandler();
        a1.setNext(a2);
        a1.handlerArticle("链接地址","csdn");
    }
}


二、装饰器模式


介绍


装饰器模式允许向一个现有的对象添加新的功能,同时又不修改其结构


举个例子,比如说,手机有没有贴膜,都是是可以使用,手机贴上膜,不影响手机的使用


实现


创建ProcessStrategy接口和实现了ProcessStrategy接口的实体类,然后创建一个实现ProcessStrategy接口的抽象装饰类ProcessHandler,并把processStrategy对象作为它的实例变量,IteratorProcess实现ProcessHandler实体类,ArticleHandler类使用ProcessHandler来装饰ProcessStrategy


444.png


步骤1


创建接口


/**
 * @author Kou Shenhai
 * @version 1.0
 * @date 2021/4/24 0024 下午 3:44
 */
public interface ProcessStrategy {
    /**
     * 爬虫具体执行方法
     * @param page
     */
     void process(Page page);
}


步骤2


创建实现接口的实现类


/**
 *
 * @author Kou Shenhai
 * @version 1.0
 * @date 2021/4/24 0024 下午 4:05
 */
public class BkyArticleProcess implements ProcessStrategy{
    @Override
    public void process(Page page) {
    }
}


/**
 *
 * @author Kou Shenhai
 * @version 1.0
 * @date 2021/4/24 0024 下午 4:05
 */
public class CsdnArticleProcess implements ProcessStrategy{
    @Override
    public void process(Page page) {
    }
}


步骤3


创建实现ProcessStrategy接口的抽象装饰类


/**
 * 装饰类 ,伪实现类
 * @author Kou Shenhai
 * @version 1.0
 * @date 2021/4/24 0024 下午 4:01
 */
public abstract class ProcessHandler implements ProcessStrategy{
    protected volatile ProcessStrategy processStrategy;
    public ProcessHandler(ProcessStrategy processStrategy) {
        this.processStrategy = processStrategy;
    }
    @Override
    public void process(Page page) {
        processStrategy.process(page);
    }
}


步骤4


扩展ProcessHandler类的实体装饰类


/**
 * 装饰者,用来装饰csdn文章
 * @author Kou Shenhai
 * @version 1.0
 * @date 2021/4/24 0024 下午 4:15
 */
public class IteratorProcess extends ProcessHandler{
    public IteratorProcess(ProcessStrategy processStrategy) {
        super(processStrategy);
    }
}


步骤5


使用IteratorProcess来装饰ProcessStrategy对象


public class ArticleHandler{
public static void main(String[] args) {
    //装饰
    IteratorProcess process = new IteratorProcess(new BkyArticleProcess());
}
}


三、观察者模式


介绍


当对象存在一对多关系时,则使用观察者模式。


举个例子,比如说一个对象的数据发生变更,则会自动通知依赖它的对象


注:jdk有对观察者模式的支持类


实现(采用jdk自带的观察者模式并进行扩展)


观察者模式使用三个类,ArticleObserver、Observer和Observable(由具体的类来实现)。Observable对象带有绑定观察者到ArticleObserver对象和从Client对象解绑观察者的方法。我们创建Observable类、Observer接口和实现Observer类的实体类


444.png

111.png


步骤1


创建Observable类


/**
 * 参考java.util.Observable
 * 让具体的实现类实现相关逻辑,^秒啊^
 * @author Kou Shenhai
 */
public interface Observable {
    /**
     * 加入观察者
     * @param o
     */
    void addObserver(Observer o);
    /**
     * 通知观察者
     * @param arg
     */
    void notifyObservers(Object arg);
    /**
     * 解绑观察者
     * @param o
     */
    void deleteObserver(Observer o);
}


步骤2


实现Observable类


public class ArticlePipeline implements Observable{
    private Vector<Observer> obs;
    public ArticlePipeline() {
        obs = new Vector<>(1);
    }
    @Override
    public void process(ResultItems resultItems, Task task) {
        notifyObservers(resultItems.getAll());
    }
    @Override
    public synchronized void addObserver(Observer o) {
        if (o == null) {
            throw new NullPointerException();
        }
        if (!obs.contains(o)) {
            obs.addElement(o);
        }
    }
    @Override
    public synchronized void notifyObservers(Object arg) {
        Object[] arrLocal;
        synchronized (this) {
            arrLocal = obs.toArray();
        }
        for (int i = arrLocal.length - 1; i >= 0; i--) {
            ((Observer)arrLocal[i]).update(this, arg);
        }
    }
    @Override
    public synchronized void deleteObserver(Observer o) {
        obs.removeElement(o);
    }
}


步骤3


创建 Observer 类


/**
 * 参考{@link java.util.Observer}设计
 * @author Kou Shenhai
 */
public interface Observer {
    /**
     * 信息变更
     * @param o
     * @param data
     */
    void update(Observable o, Object data);
}


步骤4


创建实体观察类


public class PipelineObserver implements Observer {
    @Override
    public void update(Observable o, Object data) {
    }
}


步骤5


使用Observable和实体观察者对象


public class ArticleHandler{
public static void main(String[] args) {
    Observer o = new PipelineObserver();
    Observable ob = new ArticlePipeline();
    ob.addObserver(o);
}
}
目录
相关文章
|
7天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
25 0
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
1月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
53 3
|
1月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
36 0
|
11天前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
24 2
 SpringBoot入门(7)- 配置热部署devtools工具
|
10天前
|
Java 数据库连接
SpringBoot配置多数据源实战
第四届光学与机器视觉国际学术会议(ICOMV 2025) 2025 4th International Conference on Optics and Machine Vision
37 8
|
7天前
|
Java 数据库连接 数据库
springboot启动配置文件-bootstrap.yml常用基本配置
以上是一些常用的基本配置项,在实际应用中可能会根据需求有所变化。通过合理配置 `bootstrap.yml`文件,可以确保应用程序在启动阶段加载正确的配置,并顺利启动运行。
14 2
|
19天前
|
Java Spring 容器
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
43 3
|
30天前
|
druid Java Maven
|
26天前
|
SQL Java 数据库
Spring Boot与Flyway:数据库版本控制的自动化实践
【10月更文挑战第19天】 在软件开发中,数据库的版本控制是一个至关重要的环节,它确保了数据库结构的一致性和项目的顺利迭代。Spring Boot结合Flyway提供了一种自动化的数据库版本控制解决方案,极大地简化了数据库迁移管理。本文将详细介绍如何使用Spring Boot和Flyway实现数据库版本的自动化控制。
24 2