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

一个复杂的分布式爬虫系统由很多的模块组成,每个模块是一个独立的服务(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会自动处理。

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

作者:佚名

来源:51CTO

时间: 2024-08-29 05:27:31

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

一个批量计算的调度系统的设计与实现

如果需要对成千上万的网络抓包数据文件,在规定的时间内进行解析,应该怎么做? 场景 有大量的文件 每个文件的处理需要花 大量的CPU时间,对IO的负载不大. 要在规定的时间内完成处理 思路 单机无法达成目标,需要使用集群 设计一个批量计算的调度系统 设计 因为该场景是重计算轻IO的,所以可以将所有的文件集中到某一个文件系统中,比如HDFS或者FTP. 元数据的管理,放在关系型数据库上,具体的来讲,就是放在MySQL中.因为MySQL技术相对成熟,使用的人多,能够支撑. 在每个计算节点,部署守护程序

基于java的分布式爬虫

分类 分布式网络爬虫包含多个爬虫,每个爬虫需要完成的任务和单个的爬行器类似,它们从互联网上下载网页,并把网页保存在本地的磁盘,从中抽取URL并沿着这些URL的指向继续爬行.由于并行爬行器需要分割下载任务,可能爬虫会将自己抽取的URL发送给其他爬虫.这些爬虫可能分布在同一个局域网之中,或者分散在不同的地理位置. 根据爬虫的分散程度不同,可以把分布式爬行器分成以下两大类: 1.基于局域网分布式网络爬虫:这种分布式爬行器的所有爬虫在同一个局域网里运行,通过高速的网络连接相互通信.这些爬虫通过同一个网络

如何使用.Net来设计一个爬虫系统

创业以来尝试过好几个创业项目,在每次 bootstrap的时候,往往都需要借助于一些Internet上的内容,这里不可避免的就需要写一些简单的爬虫来抓取一些数据来完成项目的初期引导.这些小的爬虫对于我学习.Net,Http Protocol, Framework Design, Design Patterns提供了很多的帮助.爬虫版本的一次一次refactoring和upgrade都往往能够加深我对于某些领域的知识的掌握. Open source方面比较有名的爬虫项目有Nutch和Heritri

【译】系统设计入门之面试题解答 —— 设计一个网页爬虫

本文讲的是[译]系统设计入门之面试题解答 -- 设计一个网页爬虫, 原文地址:Design a web crawler 原文作者:Donne Martin 译文出自:掘金翻译计划 译者:吃土小2叉 校对者:lsvih 设计一个网页爬虫 注意:这个文档中的链接会直接指向系统设计主题索引中的有关部分,以避免重复的内容.你可以参考链接的相关内容,来了解其总的要点.方案的权衡取舍以及可选的替代方案. 第一步:简述用例与约束条件 把所有需要的东西聚集在一起,审视问题.不停的提问,以至于我们可以明确使用场景

如何设计一个秒杀系统

什么是秒杀 秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到.对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购. 秒杀系统场景特点 秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增. 秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功. 秒杀业务流程比较简单,一般就是下订单减库存. 秒杀架构设计理念 限流: 鉴于只有少部分用

Grub C# client v1.0发布 分布式的网页爬虫系统

一个分布式的网页爬虫系统,包含客户端和服务器可以用来维护网页的索引. Grub C# client 1.0发行说明: First stable version of Grub Next Generation database tool is available for download. Changes since last release (0.9): - fixed bug with crash program on creating database backup- added bette

百度研发笔试题解析:设计一个系统处理词语搭配问题

题目: 设计一个系统处理词语搭配问题,比如说 中国 和人民可以搭配,则中国人民 人民中国都有效.要求: *系统每秒的查询数量可能上千次: *词语的数量级为10W: *每个词至多可以与1W个词搭配 当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息. 分析: 性能要求:每秒查询量达到上千次,意思就是QPS要达到1000以上. 搜索端使用多线程处理,现在服务器都是多核的,可以充分利用服务的资源. 数据结构: 所有词语建一张大表,并给每个词语分配一个id. 存储结构如下: id1,word1,

分布式视频点播系统的设计与实现

一 视频点播技术面临的挑战 互联网与WWW技术的发展,使人们更易于主动地获取信息.越来越多的人们更愿意及时.主动地观看节目,这一趋势正冲击着传统的单向广播.观众被动收听收看的运行模式,迫使广播电视系统向交互式方向发展,实现互动点播.但对于巨量的音视频数据,其存储.传输.大量并发性访问等使其与在目前互联网上流动的文本.图像信息有很大的差别,这些问题不解决,将难以实现有效的互动点播.本文结合以上问题,提出了一种分布式的视频点播系统模型. 虽然现在许多公司开发出了视频点播软件,如VideoCharge

如何设计一个高性能的日志系统

问题描述 如何设计一个高性能的日志系统 需求: 1.系统采用B/S架构,要求能够记录客户端的任何事件,比如单击了某个按钮或者链接: 2.要求能够记录用户每次操作时后台代码使用到的SQL和参数,比如添加数据时的SQL语句和具体的Parameter: 3.将1和2串联或者合并起来,意思就是我在分析日志时,能够在查询客户端事件时也能看到后台的SQL语句和参数: 4.2年内数据达到20亿条记录,采用什么样的数据库比较合适,非关系行的MongoDB还是关系型的Oracle: 解决方案 4.什么数据库都没关