美文网首页架构之路PythonAmazing Arch
自研文章爬取系统方案设计

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

作者: caison | 来源:发表于2018-11-30 23:00 被阅读1次

    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入门教程

    相关文章

      网友评论

        本文标题:自研文章爬取系统方案设计

        本文链接:https://www.haomeiwen.com/subject/uppccqtx.html