一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情。
写在前面
最近该系列的爬虫更新比较慢了,原因是实在写不动了,70多篇博客,每一篇都是一个案例,在写好多都不是篇博客可以容纳的了,而且爬虫的技术在70多篇中都有所涉及了,但是flag既然历下了,那么就必须要把它完成,接下来进入一些稍微稍微麻烦一点的内容,第一个咱就写分布式爬虫,这个其实核心就是提高爬取效率的,属于套路,而且是常见的讨论,走起。
为什么要用分布式
好问题,其实大多数爬虫在编写的时候如果遇到效率问题,用多进程,协程就可以满足需求了,但是当一个爬虫类的项目上升到非常大的级别或者达到商用的目的,你需要同时抓取成千上万个网站,处理上亿的请求(有点夸张了),单个的爬虫非常难实现这样的需求,就需要大量的服务器进行同时分布抓取,所以你看到大多数分布式爬虫课程到最后都是在模拟一个搜索引擎,因为搜索引擎就是一个超级爬虫。
接下来的几篇博客,可能重点都会落在scrapy-redis
这个框架或者叫做基于redis的一个组件上面,因为通过他,我们可以快速、简单的实现分布式爬虫程序
总结一句话,啥叫分布式爬虫,可以给一个不精准,但是好理解的定义
把爬虫部署在多台电脑主机上,并且互相之间还有通讯的一种爬虫技术
scrapy-redis
对于分布式爬虫,scrapy-redis 目前是应用最多的,并且是互联网相关教程说明最多的,原因也不用太深究,综合各种因素来看该框架是最简单的构建分布式爬虫的方式,而且资料全,不选他选谁?
后续我尽力把常见的分布式爬虫框架都进行依次的说明,例如scrapyd
、celery
这些,了解的越多,对待一个问题的解决方案也会变的越多。
回顾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(请求地址)进行入队列操作,然后重复的推进下去。
文字描述起来,先的枯燥无趣。可以看着下图辅助理解,分布式类似主从机制,一主多仆模式。
- 任何一个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
该错误是提示系统已经存在该服务,需要先卸载才能重新安装,出现该问题用上述第二种方式启动即可
对于redis的基本使用,也不再本文的赘述范围内,机制的你可以自行学习即可
后续的redis管理,可以使用Redis数据库桌面管理工具
推荐 Redis Desktop Manager,支持 Windows、Mac OS X、Linux 等平台:
下载地址:redisdesktop.com/download
安装scrapy-redis
pip install scrapy-redis
使用该命令安装即可,但是奇怪的是我切换国内源,发现都不能用,怪哉。
写在后面
这篇博客内容就到这里了,看起来篇幅不多,但是坑是非常多,我一直坚信开发任何东西,配置好环境就等于一半的工作进行完毕了,做分布式先把redis和scrapy-redis准备好,那后面我们肝起来就非常easy了,开始吧。
很多时候,我们无法解决技术问题,不是因为我们技术不行,而是因为我们不知道怎么才行