作者: csdbm Python爱好者社区专栏作者
个人编号:小挖掘机
博客:文文
前些天在公司的电脑上设置了几个服务器。 我有很多想尝试的东西。 今天,我参照jxdhxc老师的爬行动物实战课程,尝试了分散型爬行动物。 没有以前想象的那么神秘,其实很简单。 我相信读了这篇文章后,不到一个小时,就会得到分散型爬行动物。
1、分布式爬行动物原理
首先,让我们看看scrapy的独立体系结构。
在scrapy独立模式下,可以看到scrapy引擎通过调度程序将请求队列中的请求发送到下载程序,以滚动页面。
那么,多个主机协作的关键是共享一个队列。
因此,单主机爬虫体系结构如下图所示。
如上所述,分布式爬虫的关键是共享requests队列,维护该队列的主机称为master,从机负责数据捕获、数据处理和数据存储,因此分布式爬虫体系结构如下图所示
队列是用什么维护的? 这里使用Redis队列来保留存储
Redis是一种高效的非关系数据库,以key-value的形式存储,结构灵活,是内存中的数据结构存储系统,处理速度快,性能好。 同时提供了队列、收藏等多种存储结构,便于队列维护。
另一个问题,怎么重? 这意味着用于避免来自多个主机的访问的请求不同。 这意味着,如果reques队列中的请求不同,则必须使用Redis提供的队列结构。 Redis提供集合数据结构,在Redis集合中存储每个请求的指纹,在请求队列中添加请求时首先验证指纹是否存在。 存在时不加入。 不存在的情况下加入。
2、环境布局
目前有专用的python库来实现分布式体系结构。 Scrapy-Redis库可以重写Scrapy的调度程序、队列等组件,方便地实现Scrapy分布式体系结构。
但是,要使用此库,必须安装Redis数据库
(1) windows安装就绪
下载完成后,安装就可以了。 很简单。 (其实这里没有使用windows的redis,但是安装起来也不麻烦。 )安装完成后,默认情况下将启动windows本地redis服务。
接下来,继续安装redis可视化工具redis桌面管理器
要下载,请选择相对稳定的版本。
安装完成后,测试本地redis环境并输入连接信息。
)2)在linux上安装redis
在linux上使用命令sudo apt-get install redis将完成安装,redis-server也将在缺省情况下启动。 接下来,必须修改配置文件,以便主机可以访问虚拟机的redis数据库。
命令:使用sudo vim /etc/redis/redis.conf进行更改:
1、保护模式设定为no :
如果不设置此选项,则在windows上访问redis,然后直接崩溃。
2、bind ip注释掉:
如果不注释掉,只有本地可以访问redis,windows无法访问。
然后重新启动redis服务,并使用命令sudo service redis restart
)3)在windows上访问虚拟机redis
既然您选择了使用虚拟机上的redis数据库维护爬网队列,然后使用windows下的可视客户端访问虚拟机下的redis。
如您所见,访问成功:
3、代码实现
要使用Scrapy-Redis实现分布式爬行器,必须在scrapy的setting.py中添加以下布局: 当然,还有很多其他可用的配置,但是这里只需要添加以下几个就可以实现分布式爬行动物。
计划程序是指使用Scrapy-Redis提供的调度程序。 DUPEFILTER_CLASS设置还原机制,两个参数设置下载队列的存储位置,即Redis数据库的位置。
实现的爬行动物是百度贴吧的爬行动物,这里不详细说明
使用winscp将代码上传到三台虚拟机,并验证三台虚拟机是否具有python运行时环境。
假设虚拟机上安装了python3,请使用命令安装以下依赖关系库:
sudo apt install python-pip
sudo pip安装脚本
sudo pip install scrapy_redis
sudo pip安装pymongo
sudo pip安装就绪
4、代码执行和效果展示
我们在三台虚拟机上分别运行我们的爬虫代码,以获取百度贴吧聊天栏前100页的信息,然后使用命令
scrapy crawl tieba
如您所见,三台虚拟机同时开始爬网。
在redis中,维持了登山队列:
在短短几分钟内,我们获得了百度贴吧聊天栏100页的3900篇帖子,保存在当地的mongodb数据库中:
分散型爬虫的练习到此结束!
如果你想学习python爬行动物,欢迎来到jddbd爬行动物课程。