数据库
首页 > 数据库> > 基于模板方法模式的Scarpy-Redis分布式爬虫架构分析

基于模板方法模式的Scarpy-Redis分布式爬虫架构分析

作者:互联网

前言

本人的工程实践为金融文本的数据挖掘,这其中金融文本类的数据的获取就很关键,而这些数据是通过爬虫来获取的。
我们使用了scrapy-redis这个开源的分布式爬虫架构。而scrapy-redis这种框架的搭建恰好是使用了模板方法模式来完成的,真的是无巧不成书。

模板方法模式

《设计模式之禅》中关于模板方法的定义为:

定义一个操作中的算法框架,而将一些步骤延迟到子类中。使子类可以不改变一个算法的结构即可重定义该算法的某些步骤。

根据scrapy-redis的具体实现,我们可以来看看这段话的含义:

Scrapy-Redis

RedisSpider实现如下:

RedisCrawlSpider的实现如下:

可以看到,这其实没有定义什么东西,因为Scrapy-Reis是基于Scrapy实现的,而在Scrapy里面关于Spider和CrawlSpider的定义是比较复杂的,
但是这些都被封装起来了,用户只需要实现爬虫的具体行为即可,他们之间的继承关系大概如下图所示:

而RedisSpider和RedisCrawlSpider的区别在于,RedisSpider需要定义parse方法,该方法是对初始url返回的reponse进行解析,
parseitem则是对页面信息的提取。而在RedisCrawlSpider里不需要定义parse方法,只需要给出抽取链接的规则即可,
在RedisCrawlSpider里会自动根据用户给出的规则来提取下一个url,这种方法适用于下一页的url是静态的情况下。
若下一页的url是ajax生成的话,则需要使用RedisSpider来自己给出下一页的链接。

模板方法的优缺点

优点:
封装不变的部分,扩展可变的部分。把认为是不变的部分的算法封装到父类,可变部分的交由子类来实现!
提取公共部分的代码,行为由父类控制,子类实现!
缺点:
抽象类定义了部分抽象方法,这些抽象的方法由子类来实现,子类执行的结果影响了父类的结果(子类对父类产生了影响),会带来阅读代码的难度!

在这里附上scrapy-redis的github仓库地址:https://github.com/rmax/scrapy-redis

最后

模板方法模式是一种行为设计模式,通过使用模板方法模式,我们可以用一种更好的、更有效率的编写代码,
可以避免一些重复的编写,也可以使得各个类之间的分工更为明确。

标签:定义,子类,redis,爬虫,scrapy,Scarpy,RedisSpider,Redis
来源: https://www.cnblogs.com/ASE265/p/12003543.html