分布式多爬虫系统——架构设计
前言:
在爬虫的开发过程中,有些业务场景需要同时抓取几百个甚至上千个网站,此时就需要一个支持多爬虫的框架。在设计时应该要注意以下几点:
- 代码复用,功能模块化。如果针对每个网站都写一个完整的爬虫,那其中必定包含了许多重复的工作,不仅开发效率不高,而且到后期整个爬虫项目会变得臃肿、难以管理。
- 易扩展。多爬虫框架,这最直观的需求就是方便扩展,新增一个待爬的目标网站,我只需要写少量 必要的内容(如抓取规则、解析规则、入库规则),这样最快 最好。
- 健壮性、可维护性。这么多网站同时抓取,报错的概率更大,例如断网、中途被防爬、爬到“脏数据”等等。所以必须要做好日志监控,能实时监控爬虫系统的状态,能准确、详细地定位报错信息;另外要做好各种异常处理,如果你放假回来发现爬虫因为一个小问题已经挂掉了,那你会因为浪费了几天时间而可惜的(虽然事实上我个人会不时地远程查看爬虫状态)。
- 分布式。多网站抓取,数据量一般也比较大,可分布式扩展,这也是必需的功能了。分布式,需要注意做好消息队列,做好多结点统一去重。
- 爬虫优化。这就是大话题了,但最基本的,框架应该要基于异步,或者使用协程+多进程。
- 架构简明,要方便以后未知功能模块的添加。
需求如上,说的已经很清楚了。下面介绍一种架构设计,是去年做的了,现在分享一下。具体的代码实现就暂不公开了。
正文:
以下将通过解释两张图来说明架构的设计思想。
- 框架主要分成两部分:下载器Downloader和解析器Analyzer。Downloader负责抓取网页,Analyzer负责解析网页并入库。两者之间依靠消息队列MQ进行通信,两者可以分布在不同机器,也可分布在同一台机器。两者的数量也是灵活可变的,例如可能有五台机在做下载、两台机在做解析,这都是可以根据爬虫系统的状态及时调整的。
- 从上图可以看到MQ有两个管道:
HTML/JS文件
和待爬种子
。Downloader从待爬种子
里拿到一条种子,根据种子信息调用相应的抓取模块进行网页抓取,然后存入HTML/JS文件
这个通道;Analyzer从HTML/JS文件
里拿到一条网页内容,根据里面的信息调用相应的解析模块进行解析,将目标字段入库,需要的话还会解析出新的待爬种子加入MQ。 - 可以看到Downloader是包含User-Agent池、Proxy池、Cookie池的,可以适应复杂网站的抓取。
- 模块的调用使用工厂模式。
- 这张图是上张图的另一种表述。
- Htmls队列和Seed是队列可以独立分开,甚至数量也可以多开,之间没有联系。完全可以灵活地根据爬虫状态和硬件环境作调整。另外8G的内容可以让Redis作为Seeds队列存放5~8千万个种子。
- 分布式爬虫非常关键的一点:去重。可以看到多个解析器Analyzer共用一个去重队列,才能够保证数据的统一不重复。去重队列可以放在一台机上。基于Redis实现了Bloomfilter算法(详细见《基于Redis的Bloomfilter去重(附Python代码)》),理论上8G的内存可以满足30亿条URL的去重,如果允许漏失概率再大点的话能去重更多。
结语:
要写一个支持分布式、多爬虫的框架,具体的实现上还是有一定难度的。在实现主要功能以外,还要注意做到代码严谨 规范,爬虫高效 健壮的要求。做完这些以后,你定会成长不少!
今天就分享这些,欢迎交流!
转载请注明出处,谢谢!(原文链接:http://blog.csdn.net/bone_ace/article/details/55000416)
分布式多爬虫系统——架构设计相关推荐
- 分布式实时处理系统架构设计与机器学习实践
编者按:在2017年的1月11日,CSDN高级架构师金牌授课群为群友们带来了第一次的分享,讲师和主题参见这里,本文为课程后续的文字整理,第一时间发出来分享给读者,课件下载点击这里. 大家好,我们今天主 ...
- 各大厂分布式链路跟踪系统架构对比
随着互联网架构的扩张,分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如微服务.消息收发.分布式数据库.分布式缓存.分布式对象存储.跨域调用,这些组件共同构成了繁杂的分布式网络,那现在的问题是 ...
- 分布式调用跟踪系统的设计和应用
一.为什么需要分布式调用跟踪系统 随着分布式服务架构的流行,特别是微服务等设计理念在系统中的应用,业务的调用链越来越复杂, 可以看到,随着服务的拆分,系统的模块变得越来越多,不同的模块可能由不同的团队 ...
- 亿万级图数据库 Nebula Graph 的数据模型和系统架构设计
Nebula Graph:一个开源的分布式图数据库.作为唯一能够存储万亿个带属性的节点和边的在线图数据库,Nebula Graph 不仅能够在高并发场景下满足毫秒级的低时延查询要求,还能够实现服务高可 ...
- 程序员过关斩将--从未停止过的系统架构设计步伐
" 首先,这篇文章肯定会得罪一些人 " 其次,此文只代表我个人的意见,仅供参考 从分层说起 谈到系统架构的分层和系统领域边界的划分,每个架构师,每个技术经理,甚至每个程序员都有自己 ...
- 插件式架构设计实践:插件式系统架构设计简介
本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...
- 插件式架构设计实践一:插件式系统架构设计简介
本系列博文将使用微软RIA技术解决方案Silverlight以及扩展性管理框架Managed Extensibility Framework(MEF),以插件式架构设计为导线,分享本人在从事基于微软S ...
- 什么是系统架构设计:关于架构演进理论
什么是系统架构设计:关于架构演进理论 在过去软件开发过程发展的很长一段时间内,软件架构表现为一种集中式的单块(Monolithic)式,即先对系统进行分层,然后通过单个进程进行部署和维护,典型的分层体 ...
- 常见的系统架构设计介绍
系统架构设计介绍 分布式架构 初始阶段架构 特征 应用服务和数据服务以及文件服务分离 特征 问题 使用缓存改善性能 特征 问题 使用应用服务器集群 特征 描述 问题 数据库读写分离 特征 描述 问题 ...
最新文章
- 微服务的简介和技术栈
- 在列表前方插入一个数据_Python基础知识详解(三):数据结构篇
- yum 卸载php及依赖包,yum使用指南-软件卸载、安装、更新、获取软件包
- POJ - 2400 Supervisor, Supervisee(KM+打印方案)
- Golang 检查元素在slice中是否存在 模仿Php实现arrary_In
- 使用WM_QUIT终止线程
- php的联查,PHP的多表联查
- 打印十字图-蓝桥杯历届试题
- 「管理数学基础」4.1 模糊数学:模糊现象与模糊集、隶属函数、模糊集的运算、水平截集与分解定理
- Linux随笔 - 修改主机名
- pycharm主题、颜色、字体设置
- 苹果ocr文字识别工具:Text Scanner
- java验证码不显示_chrome无法显示Java生成的验证码图片
- 解决方案:macOS Mojave下Pycharm运行pygame无法加载外星人游戏图片以及无法修改颜色
- 图片怎么缩小到300k?如何将图片缩小到300k以内?
- auto auto const auto auto
- IKAnalyzer 配置文件介绍
- Android 内存溢出、垃圾回收、四种引用
- windows10桌面_windows10桌面美化
- mysql数据库迁移方案