自研文章爬取系统方案设计

1 系统设计分析

1.1 需求介绍

目前已有社区内容系统的文章数据较少,文章质量普遍较低,为了丰富文章内容,增加用户粘性,需要想办法从其他地方爬取文章数据,丰富社区内容系统的文章。为此,需要设计一个文章内容爬取系统,负责爬取、清洗、保存文章。

1.2 系统复杂度分析

整个系统的复杂度分析如下:

优先重点考虑

  • 可扩展
    系统需要适配爬取多个不同的数据平台,有可能是今日头条,微信公众号,等等其他平台,后续还会扩展接入其他平台,需要支持可方便扩展接入。

  • 低成本
    系统要基于现有的有限开发资源开发,整系统使用上尽量减低人力成本,减轻相关内容运营人员的工作量,做到简单实用。

相对重点考虑

  • 高性能
    因为系统定位是一个内容爬取系统,系统没有直接对接用户,用户感知不到,性能要求不是特别高。

  • 高可用
    同样系统没有直接对接用户,允许系统故障一段时间,待发现后再手工恢复。

2 架构设计

2.1 整体架构设计

系统整体架构设计

整体分为数据抽取层、数据中间存储层、数据转换存储层3层,实现数据抽取,转换,存储一系列操作,通过分层结构解耦各层的联系,方便系统后续扩展。

比如后续想再新增xx网站的爬虫,其他地方不用修改,只需新增爬虫模块即可。
或者后续业务库表发生变更,其他模块不用修改,只需要修改文章数据转换审核系统。

2.2 数据抽取层——爬虫模块设计

数据抽取层由具体对接各个不同数据源的爬虫组成,这些爬虫负责从数据源爬取定时数据,做简单数据处理后把数据保存到中间存储层。模块基本设计如下:

爬虫模块设计
整个模块基于Python3的Scrapy框架,主要由3个基本对象组成:

  • Downloader 下载器
    http请求工具,负责发送http request到被爬取的网站,把网站返回的Responses传给Spiders

  • Spiders 数据解析器
    用于数据解析,主要负责处理所有Responses,从中分析提取数据,获取Item字段需要的数据

  • Item Pipeline 数据存储器
    用于数据存储,把数据保存到中间存储层,同时负责内容去重。
    内容去重也需要基于数据存储,因为不同网站的爬虫的去重字段,去重逻辑不一致,这里不归到中间存储,还是属于网站爬虫的部分。

实际开发去重方案可以根据实际情况灵活调整优化,如果知道内容已经爬取过,可以灵活制定策略避免重复爬取。

2.3 数据中间存储层设计

负责临时存储文章数据,保存文章最基本数据,包括标题,内容等信息。存储备选方案:

  • MySQL
  • MongoDB
  • MQ(Kafka等)
    这里考虑简单满足需求,容易运维的话,MySQL 能满足当前业务需求,所以考虑选择MySQL。

2.4 数据存储转换层设计

负责从中间存储层读取数据,然后进行数据报文转换,例如加文章封面图,待运营人员审核通过后把文章写入文章业务库表。基本设计如下:

数据转换审核系统

  • 审核、编辑
    这一步需要运营编辑人员干预,在页面上对文章进行审核,编辑,审核通过才进行后续操作。

  • 图片地址转储
    将文章中的图片下载下来,重新上传到CDN下。

  • 字段填充转换
    文章封面图,文章创建人,文章分类信息等字段填充转换

  • 审核文章存储
    保存待审核,审核通过的文章,后续将写入业务库表。

3 总结

整个系统架构设计遵循如下原则:

  • 合适原则——合适优于业界领先
  • 简单原则——简单优于复杂
  • 演化原则——演化优于一步到位

架构设计的目的在于解决系统复杂度问题,真正优秀的架构都是企业当前人力、条件、业务等各种约束下设计出来的,能够合理地将资源整合在一起并发挥出最大功效、并且能够快速落地。

参考

小白进阶之Scrapy第一篇
scrapy入门教程


 上一篇
Java线上服务CPU过载问题快速定位 Java线上服务CPU过载问题快速定位
*  本文介绍一次解决线上服务*Java进程CPU过载问题的经过,提供了如果定位是哪个服务进程导致CPU过载,哪个线程导致CPU过载,哪段代码**导致CPU过载,希望能提供后续遇到类似情况的读者一点思路。 #线上环境发现的问题*  *
2019-10-13
下一篇 
设计模式-创建型模式 设计模式-创建型模式
原型模式(Prototype )意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。主要解决:在运行期建立和删除原型。 建造者模式(Builder)意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表
2019-10-13
  目录