继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

分布式爬虫:动机、原理及实现

冉冉说
关注TA
已关注
手记 198
粉丝 42
获赞 194

分布式爬虫与爬虫的区别是什么?多了“分布式”三个字。

分布式爬虫的动机

那么什么是分布式?严谨学术的概念就不搬过来了。大致来说,就是需要计算的数据量太大,任务太多,一台机器搞不定或者效率极低,需要多台机器共同协作(而不是孤立地各做各的,所以需要通信),最后所有机器完成的任务汇总在一起,完成大量任务。

在我之前的文章《大规模爬虫流程总结》中提到了任务分割方法,但这并不是严格意义上的分布式爬虫。任务分割的方法,是首先爬完了url或者id,需要爬取的任务是确定的,这个时候可以人工地将任务划分成几个互不重复的子任务,交给多台机器多个脚本去跑,这样彼此之间不通信不交流,也不会有影响。

然而还有一种情况,输入的待爬任务并不是固定不变的,而是实时变化的,这种情况下没办法人工以固定不变的逻辑去分割任务还能确保互相独立、互不干扰,最好的办法就是把任务集中在一处,在各台机器能互相通信的前提下,互不干扰地完成任务。

分布式爬虫还有一个动机,就是以机器换速度。有的网站反爬措施很严格,你必须得慢慢爬,否则稍微一浪就被封,这种情况下只靠一台机器一个脚本的速度肯定是无法容忍的。但是对于分布式爬虫,每一个机器的脚本都有不同的IP或者帐号cookie,都以很慢的速度在爬,当并行任务多了之后,总体上的速度就很可观。

如何构建分布式爬虫

如何构建分布式爬虫?如开头所说,只不过多了分布式而已,其他并无差别。Redis是一款最基于内存的no-sql数据库,简单、小巧、强大,功能应该很广泛不仅仅只是爬虫,但是在分布式爬虫中很好用。

Redis的安装与配置就不细说了,网上很多教程。Redis-server打开后长这样:

https://img4.mukewang.com/5d53b8160001403008780465.jpg

redis-server


(图中标注的是stand alone mode表示单机模式,在分布式爬虫中要配置 成cluster model的集群模式)
配置好了之后测试一下,如果在各个机器上实现了数据共享就表示打通了分布式环节了。

分布式爬虫任务调度

分布式通信中有一个Master-Slave模型:其中Master是核心,它来生产、调度任务;其他多个Slave从Master中读取任务并执行。可以简单地把Master理解成包工头,Slave是搬砖工。

一个通用的模式是一个Master对应多个Slave,Master只负责写入任务,Slave只负责读任务,二者同时进行,读写分离比较不容易出错。当然你也没必要非按这个模式来,你也可以设置成Master和Slave都可以读写任务,只要你自己能理解、控制程序逻辑。

以一个例子来说明分布式爬虫的任务调度:

Redis中有好几种数据结构,其中简单点的用set就好,用来存储互不重复的爬虫任务url;复杂点的就用hash表。首先Master程序源源不断地往Redis里写入互不重复的url,各个Slave每次随机从中抽取一个任务执行,一旦成功执行就删除该url,直到Redis中的任务已空。

这种方式会不会造成slave之间任务重复?不必担心。首先,当Redis中的任务很多时,有限的slave随机抽1个任务还能有相互重复的概率很小;其次,各个slave在执行任务时并不同步,当完成一个任务时立刻删除,所以抽到已被完成的任务概率也很小;再次,在数据库的表中建好主键,即使重复爬取,也不会重复插入。

与人工手动分割任务相比,分布式爬虫其实还有以下的优点:

  • 从Redis中读取、处理数据比在MySQL中快得多;

  • 代码基本上不用改,最多改改IP和cookie,而不必每一个脚本都去改输入任务。

爬虫的本质是什么

很多搞爬虫的总爱吹嘘分布式爬虫,仿佛只有分布式才有逼格,不是分布式简单不配叫爬虫,这是一种很肤浅的思想。

分布式只是提高爬虫功能和效率的一个环节而已,它从来不是爬虫的本质东西。爬虫的本质是网络请求和数据处理,如何稳定地访问网页拿到数据,如何精准地提取出高质量的数据才是核心问题。分布式爬虫只有当爬虫任务量很大的时候才会凸显优势,一般情况下也确实不必动用这个大杀器,所以要明确你的目标是什么。



作者:真依然很拉风
链接:https://www.jianshu.com/p/0cf250564cfa

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP