master:
一、spider文件
1.需要更改继承的类
from scrapy_redis.spiders import RedisSpider

2.注释掉start_urls

3.在爬虫目录下新创建一个redis_urls.py文件,放所有的URL到redis数据库的列表中

4.回到爬虫文件中,写一个redis_key = '列表的key'

二.settings.py文件

 1 #配置分布式的主要配置选项
2 #1.配置调度器;
3 SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
4 #2.配置去重器
5 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
6 #3.配置调度队列
7 SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.PriorityQueue'
8 #4.配置redis主机名
9 REDIS_HOST = 'localhost'
10 #5.配置redis端口号
11 REDIS_PORT = 6379

三.如果要解决scrapy-redis空跑问题
1.在项目目录下,新建一个extensions.py文件,写如下代码:

 1 import logging
2
3 from scrapy import signals
4 from scrapy.exceptions import NotConfigured
5
6 logging = logging.getLogger(__name__)
7
8
9 class RedisSpiderSmartIdleClosedExensions(object):
10
11 def __init__(self, idle_number, crawler):
12 self.crawler = crawler
13 self.idle_number = idle_number
14 self.idle_list = []
15 self.idle_count = 0
16
17 @classmethod
18 def from_crawler(cls, crawler):
19 # first check if the extension should be enabled and raise
20
21 # NotConfigured otherwise
22
23 if not crawler.settings.getbool('MYEXT_ENABLED'):
24 raise NotConfigured
25
26 if not 'redis_key' in crawler.spidercls.__dict__.keys():
27 raise NotConfigured('Only supports RedisSpider')
28
29 # get the number of items from settings
30
31 idle_number = crawler.settings.getint('IDLE_NUMBER', 360)
32
33 # instantiate the extension object
34
35 ext = cls(idle_number, crawler)
36
37 # connect the extension object to signals
38
39 crawler.signals.connect(ext.spider_opened, signal=signals.spider_opened)
40
41 crawler.signals.connect(ext.spider_closed, signal=signals.spider_closed)
42
43 crawler.signals.connect(ext.spider_idle, signal=signals.spider_idle)
44
45 return ext
46
47 def spider_opened(self, spider):
48 spider.logger.info("opened spider {}, Allow waiting time:{} second".format(spider.name, self.idle_number * 5))
49
50 def spider_closed(self, spider):
51 spider.logger.info(
52 "closed spider {}, Waiting time exceeded {} second".format(spider.name, self.idle_number * 5))
53
54 def spider_idle(self, spider):
55 # 程序启动的时候会调用这个方法一次,之后每隔5秒再请求一次
56 # 当持续半个小时都没有spider.redis_key,就关闭爬虫
57 # 判断是否存在 redis_key
58 if not spider.server.exists(spider.redis_key):
59 self.idle_count += 1
60 else:
61 self.idle_count = 0
62
63 if self.idle_count > self.idle_number:
64 # 执行关闭爬虫操作
65 self.crawler.engine.close_spider(spider, 'Waiting time exceeded')

2.打开settings.py文件中EXTENSIONS的注释,将Telent的注释掉,换上:
'项目名.extensions.RedisSpiderSmartIdleClosedExensions': 500,

3.配置settings.py文件:
# 开启扩展
MYEXT_ENABLED = True
# 每5秒就检测一次,检测10次(50秒),如果url还为空,那么就结束爬虫程序
IDLE_NUMBER = 10

slave配置:
前面都一样
需要删除redis_urls文件
settings.py的配置:

 1 #配置分布式的主要配置选项
2 #1.配置调度器;
3 SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
4 #2.配置去重器
5 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
6 #3.配置调度队列
7 SCHEDULER_QUEUE_CLASS='scrapy_redis.queue.PriorityQueue'
8 #4.配置redis主机名
9 REDIS_HOST = 'master的IP'
10 #5.配置redis端口号
11 REDIS_PORT = 6379
12 ITEM_PIPELINES = {
13 'meishi.pipelines.MeishiPipeline': 300,
14 # 'scrapy_redis.pipelines.RedisPipeline': 301
15 }

如果存到master的MongoDB数据库,需要将host改成master的ip,数据库改成master的,集合也改成master的

master端和slave端的代码保持一致(改完master端代码后复制一份当成salve端的代码),slave端需要更改以下:
1. redis_urls.py删掉
2. MongoDB数据库的主机号改为master端的

注意:scrapy-redis存在空跑问题

开始连接:
尝试连接mongo:mongo --host masterIP --port 27017
尝试连接master的redis数据库:redis-cli -h masterIP
master的redis数据库配置文件需要做如下更改:
1.将bind 127.0.0.1 注释掉
2.将protected-mode yes 改为 protected-mode no

scrapy-redis的搭建 分布式爬虫 去重的更多相关文章

  1. 基于redis的简易分布式爬虫框架

    代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...

  2. Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合

    简介:给正在学习的小伙伴们分享一下自己的感悟,如有理解不正确的地方,望指出,感谢~ 首先介绍一下这个标题吧~ 1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待 ...

  3. 使用scrapy-redis搭建分布式爬虫环境

    scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征:  分布式爬取 您可以启动多个spider工 ...

  4. 使用scrapy-redis 搭建分布式爬虫环境

    scrapy-redis 简介 scrapy-redis 是 scrapy 框架基于 redis 数据库的组件,用于 scraoy 项目的分布式开发和部署. 有如下特征: 分布式爬取: 你可以启动多个 ...

  5. python3下scrapy爬虫(第十三卷:scrapy+scrapy_redis+scrapyd打造分布式爬虫之配置)

    之前我们的爬虫都是单机爬取,也是单机维护REQUEST队列, 看一下单机的流程图: 一台主机控制一个队列,现在我要把它放在多机执行,会产生一个事情就是做重复的爬取,毫无意义,所以分布式爬虫的第一个难点 ...

  6. 使用Docker Swarm搭建分布式爬虫集群

    https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...

  7. Python 用Redis简单实现分布式爬虫

    Redis通常被认为是一种持久化的存储器关键字-值型存储,可以用于几台机子之间的数据共享平台. 连接数据库 注意:假设现有几台在同一局域网内的机器分别为Master和几个Slaver Master连接 ...

  8. python3下scrapy爬虫(第十四卷:scrapy+scrapy_redis+scrapyd打造分布式爬虫之执行)

    现在我们现在一个分机上引入一个SCRAPY的爬虫项目,要求数据存储在MONGODB中 现在我们需要在SETTING.PY设置我们的爬虫文件 再添加PIPELINE 注释掉的原因是爬虫执行完后,和本地存 ...

  9. Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站

    Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...

随机推荐

  1. Qt开发笔记:OpenSSL库介绍、windows上mingw32版本的OpenSSL编译模块化

    前言   Windows上mingw32版本的openssl的编译是属于比较棘手的,OpenSSL本身不提供支持..   OpenSSL 介绍   OpenSSL是一个开放源代码的软件库包,应用程序可 ...

  2. Jenkins 入门介绍

    一.概念 近几年,DevOps理念一致处于一个比较热门的状态.我每个月在工作群或者技术交流群都会看到这个名词出现.前年,当我第一次看到这个"DevOps",我压根不知道这是一个什么 ...

  3. Processing平台之PVector求角度

    问题:在processing 平台,通过给定三个PVector向量,如何求他们之间的夹角,同时确定是在左侧还是右侧? 如图所示,在processing 平台中,PVector表示点的坐标是以原点为起点 ...

  4. CVPR2019论文观察:感知边缘检测的双向级联网络

    CVPR2019论文观察:感知边缘检测的双向级联网络 BDCN:Bi-Directional Cascade Network for Perceptual Edge Detection 摘要 探索多尺 ...

  5. MegEngine 框架设计

    MegEngine 框架设计 MegEngine 技术负责人许欣然将带了解一个深度学习框架是如何把网络的定义逐步优化并最终执行的,从框架开发者的视角来看待深度学习. 背景 AI 浪潮一波又一波,仿佛不 ...

  6. AMD–7nm “Rome”芯片SOC体系结构,支持64核

    AMD–7nm "Rome"芯片SOC体系结构,支持64核 AMD Fully Discloses Zeppelin SOC Architecture Details at ISS ...

  7. SSM和SpringBoot常用注解

    SpringBoot的重要注解 @SpringBootApplication 创建 SpringBoot 项目之后会默认在主类加上 我们可以把 @SpringBootApplication看作是 @C ...

  8. 2.docker下centos镜像

    1.下载并运行 # 交互模式下载并运行centos容器 $ docker run -it centos:latest /bin/bash 1.1 配置centos的环境别名 $ vi /etc/bas ...

  9. java笔试题(二)

    1.写出一维数组初始化的两种方式 int[] arr={1,2,3}; String[] str=new String[2]; str[1]="23"; 2.写出二维数组初始化的两 ...

  10. Java 到底是值传递还是引用传递?

    关于这个问题,引发过很多广泛的讨论,看来很多程序员对于这个问题的理解都不尽相同,甚至很多人理解的是错误的.还有的人可能知道Java中的参数传递是值传递,但是说不出来为什么. 在开始深入讲解之前,有必要 ...