小小分布式爬虫从架构到实现(一)
做了一年多的爬虫相关工作了,来总结总结工作吧。
爬虫,是这样开始的……
首先,为啥要做这个爬虫呢?因为公司在做大数据的一些相关东西,这里没有数据怎么办呢?只能是在互联网上找一些数据了。然后……
领导大手一挥 ,“小明啊,来来来,交给你一个任务。
”我:“啥任务啊?”
领导:“这个公司的大数据平台,需要数据,这个数据来源呢大概有那么几种,首先呢,我们为了积累一些数据,我们要做一个爬虫,爬一些数据让大数据人员去处理和分析。”
我:“好啊,有什么要求吗?要是没啥要求就python上了,三行代码搞定。”
领导:“具体技术你自己看。嗯,要求也不高,大概有几百个个一千来个网站吧,每天爬个两遍,记得别爬重复了哈,最后随便找个mysql存了就行,页面图片也记得留着。到时候看看大数据平台需要啥样的数据,你给他们就行。”
我:“……好像……听起来……好像要求不是很高的样子?”
领导:“没问题吧?来来来。先给你一个excel,这里面有几十个网站,先把这些弄了吧,以后的那些下礼拜给你啊。对了,这些东西多久能做完啊?这个数据吧,相对来说还是比较紧急的呢”
领导:“哦,对了。这三十几个网站的数据有一些是没用的,我一会儿把一些关键字给你,你到时候过滤一下,java里也就是contains方法嘛,循环处理一下就完了,很简单的。”
我:“我XXXXX,这时间太短了吧?你这么描述我不是很好干活儿啊。啥时候涨一点工资啊喂……[流汗] 嗯,好的……我先看看,先看看……”、
于是,在领导的英明指导下,我bia唧一声,光荣的进入了爬虫这个坑……
先来分析一下,按照历史情况,揣摩一下领导的心思,为啥领导不随便找个软件来干这个活儿呢?可能并没有听起来这么简单,在我看完这几十来个网站之后,可能……领导需要我做个爬虫来解决以下这些问题。
1,网站形式复杂:需要将各种各样网站的一些信息提取出来,还有一些频繁刷新有验证码的,有一些还要登录的。
2,数据格式处理:需要对数据格式进行相关的处理,添加前缀后缀,时间的提取,金额的转换。
3,数据类型多样:需要爬取文字,图片,视频,pdf,word……等等等等的东西。
4,多路数据输出:需要把多个网站的数据最后汇总到多个数据库表里,对象集合可能较为复杂,有可能后续扩展到其它数据存储平台。
5,定时数据爬取:需要定时定点的去爬一些数据,需要对爬取的任务实现定时设置。
6,采集服务稳定:需要好几台(具体不知道给多少)服务器来干活儿,要保证服务的稳定性和可用性。
然后,我高高兴兴的拿着我写的东西去找我们的领导和架构师了……
架构师略微一看,“诶,这个爬虫去重吗?”
我:“……去呢吧?”
架构师:“你这个爬虫要是失败了怎么办?数据完整性怎么保证?有没有类似监控的东西?有没有报警的相关机制?日志方面怎么处理?”
我:“……”
领导:“哎呀,你这个怎么就一个简单的几行话啊,架构图给我画一张啊。”
我:“架构图……好的”
领导:“还有啊,你这个没有页面吗?你看看人家其它网站的工具,一个个配置的引导页面,你的也差不多有一个吧?对对对,还有刚刚架构师提的监控的,也要做个页面,我给你找找啊……(打开百度……搜索爬虫监控图片),对,大概就这种的”

我:“这个一个月的时间不好完成啊……”
领导:“这需要很久嘛?对了,我们这里来了几个实习生,你带着他们做吧,差不多了吧?”
我:“我的工资XXXXXX,嗯,我先看看,先看看……”
于是,在各位领导的意见与建议下,我觉得我还得解决一些问题……
1,爬虫配置:数据爬取的时候,可以添加相关配置来统一解决这些网站的数据问题,配置要通用化,抽象化。
2,任务管理:将爬虫网站细化为一个个小的任务,通过不同的任务状态来判断爬取网站成功失败。
3,数据校验:数据在爬完之后,需要对相关的数据进行校验操作,保证数据正确性。
4,监控告警:对每个网站,任务,服务器,数据等爬虫相关的资源与数据进行相关的监控与告警,保证服务稳定性和可用性。
5,日志系统:建立完整的日志系统,及时定位分析问题,辅助爬虫健康稳定运行。
6,代理IP: 防止限制IP访问,将启用代理IP来访问。
至于架构图嘛……那我就画一个吧

至于技术路线……在我绞尽脑汁,思前想后,苦思冥想,乱七八糟折腾之后,终于确定了下来:
1,基础框架:采用java的spring cloud全家桶。(既然注册中心、网关、消息总线、熔断器都做好了,我就不需要再思考啥了,拿来上吧。)
2,爬虫框架:webmagic框架。(百度谷歌了好久,既然用java的话,还是基于java来做比较好。也省心,这个框架的东西还算是全面,网上东西也多,就用这个东西来做吧。)
3,采集模拟器:Selenium、PhantomJS。(模拟浏览器嘛,这个大家都懂啦,就不解释了。)
4,缓存:Redis。(用于数据过滤和做缓存的。用的比较熟的也就是redis了……)
5,数据存储:MySQL,FastDFS,MongoDB.。(这个也就是存储数据的,领导觉得mysql看起来方便,我觉得MongoDB用起来方便,不过都没问题啦,反正是用来存储的,问题不大。剩下存文件的话,就FastDFS好了。)
6,日志:ELK。(传说中的经典……干啥都方便)
7,消息中间件:kafka,activeMQ。(主要用于任务管理【activeMQ】与消息存储与消费【kafka】)
详细的下一节再说啦。