1 系统设计分析
1.1 需求介绍
目前已有社区内容系统的文章数据较少,文章质量普遍较低,为了丰富文章内容,增加用户粘性,需要想办法从其他地方爬取文章数据,丰富社区内容系统的文章。为此,需要设计一个文章内容爬取系统,负责爬取、清洗、保存文章。
1.2 系统复杂度分析
整个系统的复杂度分析如下:
优先重点考虑
可扩展
系统需要适配爬取多个不同的数据平台,有可能是今日头条,微信公众号,等等其他平台,后续还会扩展接入其他平台,需要支持可方便扩展接入。低成本
系统要基于现有的有限开发资源开发,整系统使用上尽量减低人力成本,减轻相关内容运营人员的工作量,做到简单实用。
相对重点考虑
高性能
因为系统定位是一个内容爬取系统,系统没有直接对接用户,用户感知不到,性能要求不是特别高。高可用
同样系统没有直接对接用户,允许系统故障一段时间,待发现后再手工恢复。
2 架构设计
2.1 整体架构设计
整体分为数据抽取层、数据中间存储层、数据转换存储层3层,实现数据抽取,转换,存储一系列操作,通过分层结构解耦各层的联系,方便系统后续扩展。
比如后续想再新增xx网站的爬虫,其他地方不用修改,只需新增爬虫模块即可。
或者后续业务库表发生变更,其他模块不用修改,只需要修改文章数据转换审核系统。
2.2 数据抽取层——爬虫模块设计
数据抽取层由具体对接各个不同数据源的爬虫组成,这些爬虫负责从数据源爬取定时数据,做简单数据处理后把数据保存到中间存储层。模块基本设计如下:
整个模块基于Python3的Scrapy框架,主要由3个基本对象组成:
Downloader 下载器
http请求工具,负责发送http request到被爬取的网站,把网站返回的Responses传给SpidersSpiders 数据解析器
用于数据解析,主要负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据Item Pipeline 数据存储器
用于数据存储,把数据保存到中间存储层,同时负责内容去重。
内容去重也需要基于数据存储,因为不同网站的爬虫的去重字段,去重逻辑不一致,这里不归到中间存储,还是属于网站爬虫的部分。
实际开发去重方案可以根据实际情况灵活调整优化,如果知道内容已经爬取过,可以灵活制定策略避免重复爬取。
2.3 数据中间存储层设计
负责临时存储文章数据,保存文章最基本数据,包括标题,内容等信息。存储备选方案:
- MySQL
- MongoDB
- MQ(Kafka等)
这里考虑简单满足需求,容易运维的话,MySQL 能满足当前业务需求,所以考虑选择MySQL。
2.4 数据存储转换层设计
负责从中间存储层读取数据,然后进行数据报文转换,例如加文章封面图,待运营人员审核通过后把文章写入文章业务库表。基本设计如下:
审核、编辑
这一步需要运营编辑人员干预,在页面上对文章进行审核,编辑,审核通过才进行后续操作。图片地址转储
将文章中的图片下载下来,重新上传到CDN下。字段填充转换
文章封面图,文章创建人,文章分类信息等字段填充转换审核文章存储
保存待审核,审核通过的文章,后续将写入业务库表。
3 总结
整个系统架构设计遵循如下原则:
- 合适原则——合适优于业界领先
- 简单原则——简单优于复杂
- 演化原则——演化优于一步到位
架构设计的目的在于解决系统复杂度问题,真正优秀的架构都是企业当前人力、条件、业务等各种约束下设计出来的,能够合理地将资源整合在一起并发挥出最大功效、并且能够快速落地。