基于Redis的三种分布式爬虫策略

原创 2016年03月27日 17:27:31

前言:

爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多。
个人以为分布式爬虫需要考虑的点主要有以下几个:

  • 爬虫任务的统一调度
  • 爬虫任务的统一去重
  • 存储问题
  • 速度问题
  • 足够“健壮”的情况下实现起来越简单/方便越好
  • 最好支持“断点续爬”功能

Python分布式爬虫比较常用的应该是scrapy框架加上Redis内存数据库,中间的调度任务等用scrapy-redis模块实现。
此处简单介绍一下基于Redis的三种分布式策略,其实它们之间还是很相似的,只是为适应不同的网络或爬虫环境作了一些调整而已(如有错误欢迎留言拍砖)。


【策略一】

分布式爬虫策略一
Slaver端从Master端拿任务(Request/url/ID)进行数据抓取,在抓取数据的同时也生成新任务,并将任务抛给Master。Master端只有一个Redis数据库,负责对Slaver提交的任务进行去重、加入待爬队列。

优点: scrapy-redis默认使用的就是这种策略,我们实现起来很简单,因为任务调度等工作scrapy-redis都已经帮我们做好了,我们只需要继承RedisSpider、指定redis_key就行了。
缺点: scrapy-redis调度的任务是Request对象,里面信息量比较大(不仅包含url,还有callback函数、headers等信息),导致的结果就是会降低爬虫速度、而且会占用Redis大量的存储空间。当然我们可以重写方法实现调度url或者用户ID。


【策略二】

分布式爬虫策略二
这是对策略的一种优化改进:在Master端跑一个程序去生成任务(Request/url/ID)。Master端负责的是生产任务,并把任务去重、加入到待爬队列。Slaver只管从Master端拿任务去爬。

优点: 将生成任务和抓取数据分开,分工明确,减少了Master和Slaver之间的数据交流;Master端生成任务还有一个好处就是:可以很方便地重写判重策略(当数据量大时优化判重的性能和速度还是很重要的)。
缺点: 像QQ或者新浪微博这种网站,发送一个请求,返回的内容里面可能包含几十个待爬的用户ID,即几十个新爬虫任务。但有些网站一个请求只能得到一两个新任务,并且返回的内容里也包含爬虫要抓取的目标信息,如果将生成任务和抓取任务分开反而会降低爬虫抓取效率。毕竟带宽也是爬虫的一个瓶颈问题,我们要秉着发送尽量少的请求为原则,同时也是为了减轻网站服务器的压力,要做一只有道德的Crawler。所以,视情况而定。


【策略三】

分布式爬虫策略三
Master中只有一个集合,它只有查询的作用。Slaver在遇到新任务时询问Master此任务是否已爬,如果未爬则加入Slaver自己的待爬队列中,Master把此任务记为已爬。它和策略一比较像,但明显比策略一简单。策略一的简单是因为有scrapy-redis实现了scheduler中间件,它并不适用于非scrapy框架的爬虫。

优点: 实现简单,非scrapy框架的爬虫也适用。Master端压力比较小,Master与Slaver的数据交流也不大。
缺点: “健壮性”不够,需要另外定时保存待爬队列以实现“断点续爬”功能。各Slaver的待爬任务不通用。


结语:

如果把Slaver比作工人,把Master比作工头。策略一就是工人遇到新任务都上报给工头,需要干活的时候就去工头那里领任务;策略二就是工头去找新任务,工人只管从工头那里领任务干活;策略三就是工人遇到新任务时询问工头此任务是否有人做了,没有的话工人就将此任务加到自己的“行程表”。



转载请注明出处,谢谢!(原文链接:http://blog.csdn.net/bone_ace/article/details/50989104

爬虫总结(四)-- 分布式爬虫

分布式爬虫的演习。 分布式爬虫问题其实也就是多台机器多个 spider 对 多个 url 的同时处理问题,怎样 schedule 这些 url,怎样汇总 spider 抓取的数据。最简单粗暴的方...
  • omnispace
  • omnispace
  • 2017年02月18日 05:29
  • 2438

Python分布式爬虫原理

转载请注明出处:http://blog.csdn.net/yiliumu/article/details/21335245 首先,我们先来看看,如果是人正常的行为,是如何获取网页内容的。 (1)打...
  • permike
  • permike
  • 2016年08月10日 13:24
  • 9118

如何构建一个分布式爬虫:基础篇

本文教大家如何构建一个简易的分布式爬虫
  • u014193283
  • u014193283
  • 2017年05月22日 22:32
  • 609

分布式爬虫

这个分布式爬虫是以前自己和同学一起合作的,后来在这个基础上改进了一些特性,同样的只是提供一个大概的思路,欢迎大家提出建议 功能简介: 这个爬虫是一个可拓展的分布式爬虫,采用主从的通信模式,...
  • azhegps
  • azhegps
  • 2017年01月03日 20:52
  • 540

基于Scrapy分布式爬虫的开发与设计

这个项目也是初窥python爬虫的一个项目,也是我的毕业设计,也是学院的优秀毕业设计(害羞),当时选题的时候,发现大多数人选择的都是网站类,实在是普通不过了,都是一些简单的增删查改,业务类的给人一种很...
  • seven_2016
  • seven_2016
  • 2017年05月29日 22:33
  • 5001

如何构建一个分布式爬虫

转载自: http://python.jobbole.com/87823/ http://python.jobbole.com/87826/ http://python.jobbole....
  • ivan820819
  • ivan820819
  • 2017年06月21日 21:11
  • 816

如何构建一个分布式爬虫:理论篇

前言本系列文章计划分三个章节进行讲述,分别是理论篇、基础篇和实战篇。理论篇主要为构建分布式爬虫而储备的理论知识,基础篇会基于理论篇的知识写一个简易的分布式爬虫,实战篇则会以微博为例,教大家做一个比较完...
  • u014193283
  • u014193283
  • 2017年05月22日 09:28
  • 1000

分布式网络爬虫浅见

    昨天研究过larbin之后,晚上回去想了想,larbin是单机的爬取,速度有限,像baidu,google这样的公司肯定不是用一个爬虫去爬,不然 那么大的数据量,根本就处理不了.如果能将其改成...
  • caohao2008
  • caohao2008
  • 2007年06月24日 09:01
  • 5165

分布式网络爬虫框架Cola介绍

分布式网络爬虫框架设计        这个分布式网络爬虫框架设计思想来源于: https://github.com/chineking/cola/wiki        下面给出框架设计图:     ...
  • chenglinhust
  • chenglinhust
  • 2014年12月17日 23:57
  • 1348

分布式多爬虫系统——架构设计

前言:在爬虫的开发过程中,有些业务场景需要同时抓取几百个甚至上千个网站,此时就需要一个支持多爬虫的框架。在设计时应该要注意以下几点: 代码复用,功能模块化。如果针对每个网站都写一个完整的爬虫,那其中必...
  • Bone_ACE
  • Bone_ACE
  • 2017年02月12日 23:52
  • 8997
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于Redis的三种分布式爬虫策略
举报原因:
原因补充:

(最多只允许输入30个字)