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);
}
}
目录
相关文章
|
4天前
|
Java Maven Spring
SpringBoot配置跨模块扫描问题解决方案
在分布式项目中,使用Maven进行多模块开发时,某些模块(如xxx-common)没有启动类。如何将这些模块中的类注册为Spring管理的Bean对象?本文通过案例分析,介绍了两种解决方案:常规方案是通过`@SpringBootApplication(scanBasePackages)`指定扫描路径;推荐方案是保持各模块包结构一致(如com.xxx),利用SpringBoot默认扫描规则自动识别其他模块中的组件,简化配置。
SpringBoot配置跨模块扫描问题解决方案
|
12天前
|
机器学习/深度学习 人工智能 jenkins
探索软件测试中的自动化与持续集成
【10月更文挑战第21天】 在软件开发的生命周期中,软件测试扮演着至关重要的角色。随着技术的进步和开发模式的转变,自动化测试和持续集成已经成为提高软件质量和效率的关键手段。本文将深入探讨自动化测试和持续集成的概念、实施策略以及它们如何相互配合以优化软件开发流程。我们将通过分析实际案例,展示这些技术如何在实际项目中发挥作用,以及面临的挑战和解决方案。此外,文章还将讨论未来趋势,包括人工智能在测试领域的应用前景。
62 17
|
11天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
56 14
|
1月前
|
缓存 IDE Java
SpringBoot入门(7)- 配置热部署devtools工具
SpringBoot入门(7)- 配置热部署devtools工具
52 1
SpringBoot入门(7)- 配置热部署devtools工具
|
25天前
|
jenkins 测试技术 持续交付
软件测试中的自动化与持续集成
在现代软件开发过程中,自动化测试和持续集成已成为不可或缺的组成部分。本文将深入探讨自动化测试和持续集成的重要性、优势以及如何有效实施它们以提升软件质量和开发效率。通过具体案例分析,我们将展示这些技术如何在实际项目中发挥作用,并讨论其面临的挑战及应对策略。
48 3
|
1月前
|
jenkins 机器人 测试技术
自动化与持续集成
自动化和持续集成(CI)是现代软件开发的重要实践。自动化通过技术手段执行任务,减少人工干预,提升效率和质量。持续集成则强调频繁将代码变更集成至共享库,伴随自动化构建和测试,旨在早期发现问题,加速迭代,提高代码质量。常见CI工具有Jenkins、Travis CI等,支持多语言和框架,促进高效协作与快速反馈。
|
1月前
|
监控 安全 测试技术
在实施自动化和持续集成的过程中,如何确保代码的安全性和合规性
在自动化和持续集成中,确保代码安全与合规至关重要。措施包括集成自动化安全工具、执行自动化合规检查、进行代码质量与安全检测、评估开源代码安全、实施基础设施即代码的安全标准、采用多层防御策略、加强安全教育与文化建设、使用合规性检测工具及许可证合规分析等,共同提升代码安全性与合规水平。
|
1月前
|
监控 测试技术 持续交付
自动化和持续集成在软件开发中各自扮演什么角色
在软件开发中,自动化与持续集成(CI)相辅相成,共同提升开发效率和软件质量。自动化通过高效执行测试、构建和部署等重复任务,减少人为错误,确保流程一致性,并支持持续部署。CI则通过频繁集成代码变更、提供快速反馈、提高代码质量和促进团队协作,简化部署过程。两者结合,极大优化了软件开发流程。
|
1月前
|
监控 jenkins 测试技术
探索软件测试中的自动化与持续集成####
本文旨在探讨软件测试中自动化测试与持续集成(CI)的融合实践,分析其对提升软件开发效率和质量的重要性。通过深入剖析自动化测试的优势、持续集成的核心概念以及两者结合的最佳实践案例,揭示这一技术趋势如何重塑现代软件开发流程。文章还将讨论实施过程中的挑战和应对策略,为读者提供一套实用的方法论指导。 ####

热门文章

最新文章