一个复杂的分布式爬虫系统由很多的模块组成,每个模块是一个独立的服务(SOA架构),所有的服务都注册到Zookeeper来统一管理和便于线上扩展。模块之间通过thrift(或是protobuf,或是soup,或是json,等)协议来交互和通讯。

Zookeeper负责管理系统中的所有服务,简单的配置信息的同步,同一服务的不同拷贝之间的负载均衡。它还有一个好处是可以实现服务模块的热插拔。

URLManager是爬虫系统的核心。负责URL的重要性排序,分发,调度,任务分配。单个的爬虫完成一批URL的爬取任务之后,会找URLManager要一批新的URL。一般来说,一个爬取任务中包含几千到一万个URL,这些URL最好是来自不同的host,这样,不会给一个host在很短一段时间内造成高峰值。

ContentAcceptor负责收集来自爬虫爬到的页面或是其它内容。爬虫一般将爬取的一批页面,比如,一百个页面,压缩打包成一个文件,发送给ContentAcceptor。ContentAcceptor收到后,解压,存储到分布式文件系统或是分布式数据库,或是直接交给ContentParser去分析。

CaptchaHandler负责处理爬虫传过来的captcha,通过自动的captcha识别器,或是之前识别过的captcha的缓存,或是通过人工打码服务,等等,识别出正确的码,回传给爬虫,爬虫按照定义好的爬取逻辑去爬取。

RobotsFileHandler负责处理和分析robots.txt文件,然后缓存下来,给ContentParser和URLManager提供禁止爬取的信息。一个行为端正的爬虫,原则上是应该遵守robots协议。但是,现在大数据公司,为了得到更多的数据,基本上遵守这个协议的不多。robots文件的爬取,也是通过URLManager作为一种爬取类型让分布式爬虫去爬取的。

ProxyManager负责管理系统用到的所有Proxy,说白了,负责管理可以用来爬取的IP。爬虫询问ProxyManager,得到一批Proxy IP,然后每次访问的时候,会采用不同的IP。如果遇到IP被屏蔽,即时反馈给ProxyManager,ProxyManager会根据哪个host屏蔽了哪个IP做实时的聪明的调度。

Administor负责管理整个分布式爬虫系统。管理者通过这个界面来配置系统,启动和停止某个服务,删除错误的结果,了解系统的运行情况,等等。

各种不同类型的爬取任务,比如,像给一个URL爬取一个页面(NormalCrawler),像需要用户名和密码注册然后才能爬取(SessionCrawler),像爬取时先要输入验证码(CaptchaCrawler),像需要模拟用户的行为来爬取(Simulator),像移动页面和内容爬取(MobileCrawler),和像App内内容的爬取(AppCrawler),需要不同类型的爬虫来爬取。当然,也可以开发一个通用的爬虫,然后根据不同的类型实施不同的策略,但这样一个程序内的代码复杂,可扩展性和可维护性不强。

一个爬虫内部的爬取逻辑,通过解释从配置文件CrawlLogic来的命令来实现,而不是将爬取逻辑硬编码在爬虫程序里面。对于复杂的爬取逻辑,甚至可以通过用代码写的插件来实现。

ContentParser根据URLExtractionRules来抽取需要继续爬取的URL,因为focus的爬虫只需要爬取需要的数据,不是网站上的每个URL都需要爬取。ContentParser还会根据FieldExtractionRules来抽取感兴趣的数据,然后将原始数据结构化。由于动态生成的页面很多,很多数据是通过Javascript显示出来的,需要JavascriptEngine来帮助分析页面。这儿需要提及下,有些页面大量使用AJAX来实时获取和展示数据,那么,需要一个能解释Javascript的爬虫类型来处理这些有AJAX的情形。

为了监控整个系统的运行情况和性能,需要Monitor系统。为了调试系统,保障系统安全有据可循,需要Logger系统。有了这些,系统才算比较完备。

所有的数据会存在分布式文件系统或是数据库中,这些数据包括URL(URLRepo),Page(PageRepo)和Field(FieldRepo),至于选择什么样的存储系统,可以根据自己现有的基础设施和熟悉程度而定。

为了扩大爬虫系统的吞吐量,每个服务都可以横向扩展,包括横向复制,或是按URL来分片(sharding)。由于使用了Zookeeper,给某个服务增加一个copy,只用启动这个服务就可以了,剩下的Zookeeper会自动处理。

这里只是给出了复杂分布式爬虫系统的大框架,具体实现的时候,还有很多的细节需要处理,这时,之前做过爬虫系统,踩过坑的经验就很重要了。

如何设计一个复杂的分布式爬虫系统?相关推荐

  1. 如何设计一个比较通用的爬虫系统

    如何设计一个比较通用的爬虫系统 文章目录 如何设计一个比较通用的爬虫系统 背景介绍 页面差异 结果集不同 要发送哪些结果给用户 怎么发送这些数据给用户 项目依赖介绍 表结构 代码类间关系 操作流程 背 ...

  2. 手把手教你搭建一个基于Java的分布式爬虫系统

    http://blog.51cto.com/xpleaf/2093952 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HB ...

  3. 分布式爬虫系统的设计与实现(SourceForge.net数据爬取)

    目录 本科生毕业论文(设计)中文摘要 I 本科生毕业论文(设计)英文摘要 II 目录 I 图目录 III 表目录 IV 第一章 引言 1 1.1 研究背景 1 1.1.1 SourceForge.ne ...

  4. python分布式爬虫系统_如何构建一个分布式爬虫:理论篇

    前言 本系列文章计划分三个章节进行讲述,分别是理论篇.基础篇和实战篇.理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一个比较 ...

  5. 基于SpringBoot和Vue的分布式爬虫系统(JavaWeb)

    前言 本期案例分享,学长给大家上点干货,手把手带你开发一个分布式爬虫系统.通过这个项目,你将学习到下面几点: 架构设计.如果设计一个通用的爬虫系统?一个系统支持爬取所有的网站. 分布式开发经验.分布式 ...

  6. python分布式爬虫系统_三种分布式爬虫系统的架构方式

    分布式爬虫系统广泛应用于大型爬虫项目中,力求以最高的效率完成任务,这也是分布式爬虫系统的意义所在. 分布式系统的核心在于通信,介绍三种分布式爬虫系统的架构思路,都是围绕通信开始,也就是说有多少分布式系 ...

  7. 如何设计一个高可用的运营系统

    转载自   如何设计一个高可用的运营系统 这是一篇来自粉丝的投稿,作者[林湾村龙猫]近一年在做关于运营活动方面的设计.本文是他的关于运营活动的总结,Hollis做了一点点修改. 概述 一个产品业务的发 ...

  8. 设计一个脉冲发生器,已知系统时钟为50MHz,生成脉冲宽度为1ms,脉冲间隔可调,最大间隔为1s

    设计一个脉冲发生器,已知系统时钟为50MHz,生成脉冲宽度为1ms,脉冲间隔可调,最大间隔为1s Design a pulse generator. The system clock is known ...

  9. 4.3 设计一个完善的响应式系统

    4.3 设计一个完善的响应式系统 关键词 响应系统的工作流程: 当读取操作发生时,将副作用函数收集到"桶"中. 当设置操作发生时,从"桶"中取出副作用函数并执行 ...

最新文章

  1. 【Qt】Qt再学习(六):Qt中JSON保存和加载的示例
  2. ROS创建工作空间与节点
  3. ICRA2021| 自动驾驶相关论文汇总
  4. 取文字_取一个好听的女孩名字
  5. 如何在Laravel 中对大文件进行加密?
  6. Spring中@Pattern的使用
  7. 字符串拷贝函数memcpy()、strncpy()和snprintf()性能之比较
  8. [转载]Android创世纪 - 第二天
  9. 燃烧学往年精选真题解析
  10. Scala可变数组ArrayBuffer:查询/修改/遍历/增加/删除
  11. ubuntu更新时区和时间
  12. IS2009制作Oracle 静默安装包(二) 感谢空白先生特许授权
  13. 洛谷 P1340 兽径管理
  14. 跨域请求——jsonp与cors
  15. 关于JAVA调用oracle存储过程
  16. 安装WIN 7 64位Windows6.1-KB2999226-x64.msu
  17. 2021年N1叉车司机免费试题及N1叉车司机模拟试题
  18. 逆向分析CrackMe系列——CrackMe003
  19. python选择日期控件_【Python】python 日期操作
  20. Windows系统cmd命令+实用工具

热门文章

  1. sqlmap基础使用手册 ─=≡Σ(((つ•̀ω•́)つ 知己知彼百战百胜 web安全
  2. jquery表格隔行变色
  3. 个人申请支付宝微信支付接口教程(无需营业执照)
  4. C#值类型后问号的作用
  5. Java 求解岛屿数量
  6. 基于SSM框架的文章管理系统
  7. Oracle VM VirtualBox安装Win10系统
  8. Java-万年历的设计与实现
  9. shell文件编辑器之sed
  10. java绘制均线图_利用JFreeChart绘制股票K线图完整解决方案