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);
}
}
目录
相关文章
|
11天前
|
人工智能 Ubuntu 前端开发
Dify部署全栈指南:AI从Ubuntu配置到HTTPS自动化的10倍秘籍
本文档介绍如何部署Dify后端服务及前端界面,涵盖系统环境要求、依赖安装、代码拉取、环境变量配置、服务启动、数据库管理及常见问题解决方案,适用于开发与生产环境部署。
184 1
|
11天前
|
Java 测试技术 数据安全/隐私保护
通过yaml文件配置自动化测试程序
通过yaml文件可以将自动化测试环境,测试数据和测试行为分开,请看一下案例
32 4
|
3月前
|
人工智能 运维 Java
配置优化还靠拍脑袋?试试AI自动化,真香!
配置优化还靠拍脑袋?试试AI自动化,真香!
83 0
|
11月前
|
运维 Linux Apache
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
Puppet 作为一款强大的自动化运维工具,被广泛应用于配置管理领域。通过定义资源的状态和关系,Puppet 能够确保系统始终处于期望的配置状态。
356 3
|
11月前
|
Java Maven Docker
gitlab-ci 集成 k3s 部署spring boot 应用
gitlab-ci 集成 k3s 部署spring boot 应用
|
10月前
|
数据采集
使用 Puppeteer 绕过 Captcha:实现商家数据自动化采集
本文介绍了如何使用Puppeteer结合代理IP和用户伪装技术,轻松绕过大众点评的Captcha验证,实现商家信息的高效采集。通过配置Puppeteer、设置代理和用户伪装参数、模拟人类操作等步骤,成功提取了目标页面的数据。该方法不仅提高了爬虫的稳定性和隐蔽性,还为市场研究和商业分析提供了有力支持。注意,数据采集需遵守法律法规及网站政策。
304 1
使用 Puppeteer 绕过 Captcha:实现商家数据自动化采集
|
10月前
|
消息中间件 监控 Java
您是否已集成 Spring Boot 与 ActiveMQ?
您是否已集成 Spring Boot 与 ActiveMQ?
315 0
|
11月前
|
运维 应用服务中间件 Linux
自动化运维:使用Ansible管理服务器配置
【10月更文挑战第2天】在现代IT运维中,自动化是提高效率和减少错误的关键。本文将介绍如何使用Ansible这一强大的自动化工具来简化日常的服务器管理工作。我们将从基础讲起,逐步深入到高级应用,展示如何通过编写简单的Playbooks来自动化复杂的配置任务。文章还将探讨Ansible的最佳实践,并分享一些实际案例来说明其在实际工作中的应用。
|
11月前
|
Linux 应用服务中间件 Shell
利用 ACME 实现SSL证书自动化配置更新
【10月更文挑战第11天】多项式承诺原理是密码学中的重要工具,允许证明者向验证者承诺一个多项式并证明其某些性质。Kate多项式承诺是一种知名方案,基于有限域上的多项式表示,通过生成和验证简洁的证明来确保多项式的正确性和隐私。其安全性基于离散对数假设。应用场景包括区块链中的零知识证明和可验证计算,以及多方计算和身份认证协议。在区块链中,Kate多项式承诺可用于保护隐私币和智能合约中的敏感信息。
691 2
|
持续交付 jenkins Devops
WPF与DevOps的完美邂逅:从Jenkins配置到自动化部署,全流程解析持续集成与持续交付的最佳实践
【8月更文挑战第31天】WPF与DevOps的结合开启了软件生命周期管理的新篇章。通过Jenkins等CI/CD工具,实现从代码提交到自动构建、测试及部署的全流程自动化。本文详细介绍了如何配置Jenkins来管理WPF项目的构建任务,确保每次代码提交都能触发自动化流程,提升开发效率和代码质量。这一方法不仅简化了开发流程,还加强了团队协作,是WPF开发者拥抱DevOps文化的理想指南。
253 1