分布式爬虫初步解析-配好环境肝完一半

544 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

写在前面

最近该系列的爬虫更新比较慢了,原因是实在写不动了,70多篇博客,每一篇都是一个案例,在写好多都不是篇博客可以容纳的了,而且爬虫的技术在70多篇中都有所涉及了,但是flag既然历下了,那么就必须要把它完成,接下来进入一些稍微稍微麻烦一点的内容,第一个咱就写分布式爬虫,这个其实核心就是提高爬取效率的,属于套路,而且是常见的讨论,走起。

为什么要用分布式

好问题,其实大多数爬虫在编写的时候如果遇到效率问题,用多进程,协程就可以满足需求了,但是当一个爬虫类的项目上升到非常大的级别或者达到商用的目的,你需要同时抓取成千上万个网站,处理上亿的请求(有点夸张了),单个的爬虫非常难实现这样的需求,就需要大量的服务器进行同时分布抓取,所以你看到大多数分布式爬虫课程到最后都是在模拟一个搜索引擎,因为搜索引擎就是一个超级爬虫。

接下来的几篇博客,可能重点都会落在scrapy-redis这个框架或者叫做基于redis的一个组件上面,因为通过他,我们可以快速、简单的实现分布式爬虫程序

总结一句话,啥叫分布式爬虫,可以给一个不精准,但是好理解的定义

把爬虫部署在多台电脑主机上,并且互相之间还有通讯的一种爬虫技术

scrapy-redis

对于分布式爬虫,scrapy-redis 目前是应用最多的,并且是互联网相关教程说明最多的,原因也不用太深究,综合各种因素来看该框架是最简单的构建分布式爬虫的方式,而且资料全,不选他选谁?

后续我尽力把常见的分布式爬虫框架都进行依次的说明,例如scrapydcelery 这些,了解的越多,对待一个问题的解决方案也会变的越多。

回顾scrapy的架构

scrapy默认是单机爬虫,有过了解的朋友(当然,你如果持续看到我今天的博客,应该在之前已经对scrapy有过认识了,当然不能说看过几篇博客就能精通)应该知道在scrapy中有一个本地爬取队列Queue,这个队列是利用deque模块实现的,如果有新的请求发起之后,就会放到队列里面,然后该请求会被scheduler调度,之后该请求就会交给Downloader执行爬取。网络上有非常多相关的图,我这里就不在复制一份贴在博客里面了。

而我们分布式是爬虫的目标是什么?在多台主机上同时运行爬虫任务

这样整理之后,逻辑就变得非常简单了,我们需要找一台单独的主机,在其上运行一个共享队列,这个队列需要去重,从技术的角度在考虑,这个用redis是最高效的。那解决方案自然就出现了,scrapy-redis。

scrapy-redis 简介

scrapy-redis 是基于redis的一个scrapy组件,它重构了原scrapy的scheduler调度方式,改造了collection.deque,将scrapy queue 换成了redis数据库,在同一个redis-server(redis服务器)中存放要爬取的request(请求地址),然后让多个spider(爬虫程序)去同一个redis-server中读取,调度器对新的request(请求地址)进行入队列操作,然后重复的推进下去。

文字描述起来,先的枯燥无趣。可以看着下图辅助理解,分布式类似主从机制,一主多仆模式。

image.png

  • 任何一个Slaver端都需要从Master拿到Request(待抓取URL),然后去互联网抓取数据,在抓取的同时还存在Slaver获取到新的Request也要反馈给Master处理
  • Master端只有一个redis数据库,负责将所有未处理的Request去重和分配,然后将处理好的Request加入待爬取队列,等待Slaver来获取,当然它还需要负责存储爬取到的数据。

环境配置

对于scrapy-redis来说,编码环节没有特别复杂的地方,整体看来,配置环境是最需要花功夫的地方,所以,我们还是先从环境入手,这部分在互联网上的教程实在是太多了,善于使用百度也是编程者的基本技能之一,对于这个框架/组建来说,redis是必须的。

安装redis

你的第一步就应该是配置redis,具体的方法希望你自行检索出来,这里只做一些重点的内容说明和最终结果展示 如果你是windows电脑,这里推荐一篇博客(随便选的),参考即可:www.cnblogs.com/BalmyLee/p/… 不是也没有关系,百度检索 redis安装与启动 文章如海上的浪花一般。

安装完毕,运行起来出现如图所示即可等待下一步操作了 这个地方需要注意,目前很多博客中给出的两种启动方式 第一种:redis-server --service-install redis.windows.conf --service-name redis 这种用在第一次启动的时候,顺便把redis给安装成系统服务了 第二种:redis-server.exe redis.windows.conf 这种是后续的启动方式

以上两种方式如果使用混乱,会出现如下错误

HandleServiceCommands: system error caught. error code=1073

该错误是提示系统已经存在该服务,需要先卸载才能重新安装,出现该问题用上述第二种方式启动即可 Python爬虫入门教程 72-100 对于redis的基本使用,也不再本文的赘述范围内,机制的你可以自行学习即可

后续的redis管理,可以使用Redis数据库桌面管理工具

推荐 Redis Desktop Manager,支持 Windows、Mac OS X、Linux 等平台:

下载地址:redisdesktop.com/download

安装scrapy-redis

pip install scrapy-redis

使用该命令安装即可,但是奇怪的是我切换国内源,发现都不能用,怪哉。 Python爬虫入门教程 72-100

写在后面

这篇博客内容就到这里了,看起来篇幅不多,但是坑是非常多,我一直坚信开发任何东西,配置好环境就等于一半的工作进行完毕了,做分布式先把redis和scrapy-redis准备好,那后面我们肝起来就非常easy了,开始吧。


很多时候,我们无法解决技术问题,不是因为我们技术不行,而是因为我们不知道怎么才行