今天,参照崔庆才老师的爬虫实战课程,实践了一下分布式爬虫,并没有之前想象的那么神秘,其实非常的简单,相信你看过这篇文章后,不出一小时,便可以动手完成一个分布式爬虫!

1、分布式爬虫原理

首先我们来看一下scrapy的单机架构:

可以看到,scrapy单机模式,通过一个scrapy引擎通过一个调度器,将Requests队列中的request请求发给下载器,进行页面的爬取。

那么多台主机协作的关键是共享一个爬取队列。

所以,单主机的爬虫架构如下图所示:

前文提到,分布式爬虫的关键是共享一个requests队列,维护该队列的主机称为master,而从机则负责数据的抓取,数据处理和数据存储,所以分布式爬虫架构如下图所示:

那么队列用什么维护呢,这里我们选用Redis队列进行存储,

Redis是一种高效的非关系型数据库,以key-value的形式存储,结构灵活,它是内存中的数据结构存储系统,处理速度快,性能好,同时,提供了队列,集合等多种存储结构,方便队列维护。

另外一个问题,如何去重?这个的意思就是如何避免多台主机访问的request都不同,即让Reques队列中的请求都是不同的,那么就需要用到Redis提供的队列结构。Redis提供集合数据结构,在Redis集合中存储每个Request的指纹,在向Request队列中加入Request时首先验证指纹是否存在。如果存在,则不加入,如果不存在,则加入。

2、环境配置

目前已经有专门的python库实现了分布式架构。Scrapy-Redis库改写了Scrapy的调度器,队列等组件,可以方便的实现Scrapy分布式架构。

Scrapy-Redis链接:https://github.com/rolando/scrapy-redis

不过,想要运用这个库,我们需要安装Redis数据库

(1)windows安装redis

下载地址:https://github.com/MSOpenTech/redis/releases

下载完成后,安装即可,非常简单(其实这里没有用到windows的redis,不过装一装也不麻烦),安装完成后,windows的本地redis服务是默认启动的。

接下来可以继续安装一个redis可视化工具,Redis Desktop Manager

下载地址:https://github.com/uglide/RedisDesktopManager/releases

我们选择一个比较稳定的版本进行下载:

安装完成,我们可以测试一下本地的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中添加如下的配置,当然还有很多其他可用配置,这里只需添加如下的几个就可以实现分布是爬取:

SCHEDULER的意思就是使用Scrapy-Redis提供的调度器,DUPEFILTER_CLASS设置了去重机制,而后两个参数设置了下载队列的存储位置,即Redis数据库的位置。

实现的爬虫是百度贴吧的爬虫,这里就不详细说明了

具体代码参见:https://github.com/princewen/python3_crawl (使用python3.5编写)

使用winscp将代码上传到三台虚拟机上,并确保三台虚拟机有python的运行环境.

假设虚拟机上安装了python3,那么使用命令安装如下的依赖库:

sudo apt install python-pip

sudo pip install scrapy

sudo pip install scrapy_redis

sudo pip install pymongo

sudo pip install redis

4、代码运行及效果展示

我们在三台虚拟机上分别运行我们的爬虫代码抓取百度贴吧聊天吧的前100页信息,使用命令

scrapy crawl tieba

可以看到,三台虚拟机同时开始爬取:

而redis中,则维护了一个爬取队列:

短短几分钟,我们就抓取了百度贴吧聊天吧的100页帖子3900+条,存入了本地的mongodb数据库:

至此,分布式爬虫练手完毕!

参考崔大神的博客http://cuiqingcai.com/

scrapy进行分布式爬虫的更多相关文章

  1. Scrapy 框架 分布式 爬虫

    分布式 爬虫 scrapy-redis 实现 原生scrapy 无法实现 分布式 调度器和管道无法被分布式机群共享 环境安装 - pip install scrapy_redis 导包:from sc ...

  2. 16 Scrapy之分布式爬虫

    redis分布式部署 1.scrapy框架是否可以自己实现分布式? - 不可以.原因有二. 其一:因为多台机器上部署的scrapy会各自拥有各自的调度器,这样就使得多台机器无法分配start_urls ...

  3. scrapy补充-分布式爬虫

    spiders 介绍:在项目中是创建爬虫程序的py文件 #1.Spiders是由一系列类(定义了一个网址或一组网址将被爬取)组成,具体包括如何执行爬取任务并且如何从页面中提取结构化的数据. #2.换句 ...

  4. scrapy简单分布式爬虫

    经过一段时间的折腾,终于整明白scrapy分布式是怎么个搞法了,特记录一点心得. 虽然scrapy能做的事情很多,但是要做到大规模的分布式应用则捉襟见肘.有能人改变了scrapy的队列调度,将起始的网 ...

  5. 基于scrapy的分布式爬虫抓取新浪微博个人信息和微博内容存入MySQL

    为了学习机器学习深度学习和文本挖掘方面的知识,需要获取一定的数据,新浪微博的大量数据可以作为此次研究历程的对象 一.环境准备   python 2.7  scrapy框架的部署(可以查看上一篇博客的简 ...

  6. 第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    第三百六十五节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询 1.elasticsearch(搜索引擎)的查询 elasticsearch是功能 ...

  7. 四十四 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)的基本查询

    1.elasticsearch(搜索引擎)的查询 elasticsearch是功能非常强大的搜索引擎,使用它的目的就是为了快速的查询到需要的数据 查询分类: 基本查询:使用elasticsearch内 ...

  8. python爬虫--分布式爬虫

    Scrapy-Redis分布式爬虫 介绍 scrapy-redis巧妙的利用redis 实现 request queue和 items queue,利用redis的set实现request的去重,将s ...

  9. 基于Python,scrapy,redis的分布式爬虫实现框架

    原文  http://www.xgezhang.com/python_scrapy_redis_crawler.html 爬虫技术,无论是在学术领域,还是在工程领域,都扮演者非常重要的角色.相比于其他 ...

随机推荐

  1. Android数据绑定技术二,企业级开发

    PS:上一篇文章写了Databinding的简单使用,写了一个绑定textview的示例,和绑定的一些用法,估计有的人会说,之前的写的好好的,为什么要数据绑定这样的写法呢,没办法,社会在进步,当然是怎 ...

  2. 手机APP 后端设计

      原则:   命名知其意. 一看api名字就知道这个api是干啥.   api返回数据禁止null   服务器动态处理原图(如 60x60 .80x80).  例如,客户端需要图片(http://w ...

  3. 问问javascript

    问题1:在创建新函数(如function P(){};)的时候会自动创建一个原型对象P.prototype(也称作原型属性prototype).当创建一个新对象(此处指非函数对象,在js里面函数也会被 ...

  4. Tomcat 中部署 web 应用 ---- Dubbo 服务消费者 Web 应用 war 包的部署

    使用Maven构建Dubbo服务的可执行jar包 Dubbo服务的运行方式: 1.使用Servlet容器运行(Tomcat.Jetty等)----不可取 缺点:增加复杂性(端口.管理) 浪费资源(内存 ...

  5. 笨办法学Python(二)

    习题 2: 注释和井号 程序里的注释是很重要的.它们可以用自然语言告诉你某段代码的功能是什么.在你想要临时移除一段代码时,你还可以用注解的方式将这段代码临时禁用.接下来的练习将让你学会注释: #-- ...

  6. C盘压缩,电脑无法正常启动的解决方法?

    有时候,我们觉得电脑很卡,因此压缩磁盘来节约资源,前段时间,由于不小心将C盘压缩了,导致电脑无法正常启动,查了一些有关的资料,发现很多人都遇到过类似的问题,如果你不想重装系统的话,那么,现在我说一下我 ...

  7. iis 发布失败原因总结

    3篇文章 1. https://www.cnblogs.com/adzhouyang/p/7357086.html 2..https://blog.csdn.net/li_ser/article/de ...

  8. zen-Coding在Notepad++中的使用

    zen-Coding是一款快速编写HTML,CSS(或其他格式化语言)代码的编辑器插件,这个插件可以用缩写方式完成大量重复的编码工作,是web前端从业者的利器. zen-Coding插件支持多种编辑器 ...

  9. JVM性能调优(out of memory内存溢出/泄露出来)

    JVM基础知识: JVM调优工具: 1.jmap jmap常用参数 命令:jmap -heap PID >> D:\heap.log 解释: using thread-local obje ...

  10. vs code配置c/c++调试环境+mingw+windows

    目录 1.安装codeblocks 2.配置mingw环境变量 3.配置.vscode文件夹的json文件 ref 1.安装codeblocks 我已经安装过vscode和c++扩展插件,现在需要g+ ...