这是我参与「第四届青训营 」笔记创作活动的第一天
这是此次大项目的实现,在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL、HBase等。
基于面向接口的编码思想来开发,因此这个系统具有一定的扩展性,有兴趣的朋友直接看一下代码,就能理解其设计思想,虽然代码目前来说很多地方还是比较紧耦合,但只要花些时间和精力,很多都是可抽取出来并且可配置化的。
因为时间的关系,我只写了京东和苏宁易购两个网站的爬虫,但是完全可以实现不同网站爬虫的随机调度,基于其代码结构,再写国美、天猫等的商品爬取,难度不大,但是估计需要花很多时间和精力。因为在解析网页的数据时,实际上需要花很多时间,比如我在爬取苏宁易购商品的价格时,价格是异步获取的,并且其API是一长串的数字组合,我花了几个小时的时间才发现其规律,当然也承认,我的经验不足。
这个系统的设计,除了基本的数据爬取以外,更关注以下几个方面的问题:\
- 如何实现分布式,同一个程序打包后分发到不同的节点运行时,不影响整体的数据爬取
- 如何实现url随机循环调度,核心是针对不同的顶级域名做随机
- 如何定时向url仓库中添加种子url,达到不让爬虫系统停下来的目的
- 如何实现对爬虫节点程序的监控,并能够发邮件报警
- 如何实现一个随机IP代理库,目的跟第2点有点类似,都是为了反反爬虫
下面会针对这个系统来做一个整体的基本介绍,其实我在代码中都有非常详细的注释,有兴趣的朋友可以参考一下代码,最后我会给出一些我爬虫时的数据分析。
分布式爬虫系统架构
整体系统架构如下:\
所以从上面的架构可以看出,整个系统主要分为三个部分:\
- 爬虫系统
- URL调度系统
- 监控报警系统
爬虫系统就是用来爬取数据的,因为系统设计为分布式,因此,爬虫程序本身可以运行在不同的服务器节点上。
URL调度系统核心在于URL仓库,所谓的URL仓库其实就是用Redis保存了需要爬取的URL列表,并且在我们的URL调度器中根据一定的策略来消费其中的URL,从这个角度考虑,URL仓库其实也是一个URL队列。
监控报警系统主要是对爬虫节点进行监控,虽然并行执行的爬虫节点中的某一个挂掉了对整体数据爬取本身没有影响(只是降低了爬虫的速度),但是我们还是希望知道能够主动接收到节点挂掉的通知,而不是被动地发现。
下面将会针对以上三个方面并结合部分代码片段来对整个系统的设计思路做一些基本的介绍,对系统完整实现有浓厚兴趣的朋友可以直接参考源代码。