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. Git 系列教程(14)- 远程分支

    远程分支 远程引用是对远程仓库的引用(指针),包括分支.标签等等 你可以通过 git ls-remote <remote> 来显式地获得远程引用的完整列表 polo@B-J5D1MD6R- ...

  2. ThinkPHP无限级分类(递归)

    代码演示 没什么可说的直接看代码 <?php namespace app\controller; class Category { //模拟假数据 protected static functi ...

  3. Django(44)drf序列化源码分析(1)

    序列化与反序列化   一般后端数据返回给前端的数据格式都是json格式,简单易懂,但是我们使用的语言本身并不是json格式,像我们使用的Python如果直接返回给前端,前端用的javascript语言 ...

  4. Linux系统挂载NFS文件系统

    https://help.aliyun.com/document_detail/90529.html?spm=a2c4g.11186623.6.570.43212f30T5yM4w

  5. 如何安装selenium以及scrapy,最重要的是pip?

    一般的步骤: # Selenium安装配置        # 1. 安装python的selenium包:pip install selenium# 2. Selenium驱动(Chrome)下载: ...

  6. THINKPHP_(1)_修改TP源码,支持对中文字符串按拼音进行排序。

    问题:TP从服务器数据中取出的collection数据,当进一步在网页中进行分页显示时,需要调用order函数,实现类似如下图的排序. 当点击页面中的相关内容时,实现对服务器数据进行重排,就要调用TP ...

  7. Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构)

    Xilinx低比特率高品质 ABR 视频实时转码(HPE 参考架构) 介绍 对实时视频流的需求给视频服务提供商带来了严峻挑战,必须在管理基础设施和互联网带宽运营成本,还要为客户提供高质量体验.鉴于视频 ...

  8. Jittor实现Conditional GAN

    Jittor实现Conditional GAN Generative Adversarial Nets(GAN)提出了一种新的方法来训练生成模型.然而,GAN对于要生成的图片缺少控制.Conditio ...

  9. TinyML-TVM是如何驯服Tiny的(下)

    TinyML-TVM是如何驯服Tiny的(下) Lazy Execution实际上,随着通信开销开始占主导地位,一旦用户请求,就执行算子的开销变得非常昂贵.可以通过延迟评估直到用户需要调用的结果来提高 ...

  10. 瞎搞!你真的懂什么是ERP、中台和低代码吗?

    欢迎关注微信公众号:sap_gui (ERP咨询顾问之家) 互联网信息圈就是这样,写个不知所云的文章,再配上博眼球的标题,立马引来众多围观,不少公众号也蜂拥转载,完全不去思考文章写得对不对,有没有道理 ...