scrapy-redis的搭建 分布式爬虫 去重
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的搭建 分布式爬虫 去重的更多相关文章
- 基于redis的简易分布式爬虫框架
代码地址如下:http://www.demodashi.com/demo/13338.html 开发环境 Python 3.6 Requests Redis 3.2.100 Pycharm(非必需,但 ...
- Scrapy+Scrapy-redis+Scrapyd+Gerapy 分布式爬虫框架整合
简介:给正在学习的小伙伴们分享一下自己的感悟,如有理解不正确的地方,望指出,感谢~ 首先介绍一下这个标题吧~ 1. Scrapy:是一个基于Twisted的异步IO框架,有了这个框架,我们就不需要等待 ...
- 使用scrapy-redis搭建分布式爬虫环境
scrapy-redis简介 scrapy-redis是scrapy框架基于redis数据库的组件,用于scrapy项目的分布式开发和部署. 有如下特征: 分布式爬取 您可以启动多个spider工 ...
- 使用scrapy-redis 搭建分布式爬虫环境
scrapy-redis 简介 scrapy-redis 是 scrapy 框架基于 redis 数据库的组件,用于 scraoy 项目的分布式开发和部署. 有如下特征: 分布式爬取: 你可以启动多个 ...
- python3下scrapy爬虫(第十三卷:scrapy+scrapy_redis+scrapyd打造分布式爬虫之配置)
之前我们的爬虫都是单机爬取,也是单机维护REQUEST队列, 看一下单机的流程图: 一台主机控制一个队列,现在我要把它放在多机执行,会产生一个事情就是做重复的爬取,毫无意义,所以分布式爬虫的第一个难点 ...
- 使用Docker Swarm搭建分布式爬虫集群
https://mp.weixin.qq.com/s?__biz=MzIxMjE5MTE1Nw==&mid=2653195618&idx=2&sn=b7e992da6bd1b2 ...
- Python 用Redis简单实现分布式爬虫
Redis通常被认为是一种持久化的存储器关键字-值型存储,可以用于几台机子之间的数据共享平台. 连接数据库 注意:假设现有几台在同一局域网内的机器分别为Master和几个Slaver Master连接 ...
- python3下scrapy爬虫(第十四卷:scrapy+scrapy_redis+scrapyd打造分布式爬虫之执行)
现在我们现在一个分机上引入一个SCRAPY的爬虫项目,要求数据存储在MONGODB中 现在我们需要在SETTING.PY设置我们的爬虫文件 再添加PIPELINE 注释掉的原因是爬虫执行完后,和本地存 ...
- Python分布式爬虫打造搜索引擎完整版-基于Scrapy、Redis、elasticsearch和django打造一个完整的搜索引擎网站
Python分布式爬虫打造搜索引擎 基于Scrapy.Redis.elasticsearch和django打造一个完整的搜索引擎网站 https://github.com/mtianyan/Artic ...
随机推荐
- window location href is not a function(Day_36)
报window location href is not a function错误的解决方案: 原因: JS报错是由于写法问题或浏览器不兼容导致的,具体解决方法如下: 原来报错的写法: window. ...
- Django(37)配置django日志
前言 django框架的日志通过python内置的logging模块实现的,既可以记录自定义的一些信息描述,也可以记录系统运行中的一些对象数据,还可以记录包括堆栈跟踪.错误代码之类的详细信息. ...
- GO学习-(29) Go语言操作etcd
Go语言操作etcd etcd是近几年比较火热的一个开源的.分布式的键值对数据存储系统,提供共享配置.服务的注册和发现,本文主要介绍etcd的安装和使用. etcd etcd介绍 etcd是使用Go语 ...
- CMOS图像传感器同时感知和处理光学图像
CMOS图像传感器同时感知和处理光学图像 概述 近年来,机器视觉技术有了巨大的飞跃,现在已经成为各种智能系统的一个组成部分,包括自主车辆和机器人.通常,视觉信息由基于帧的摄像机捕获,转换成数字格式,然 ...
- Git 快速控制
Git 快速控制 聊聊学习 Git 那些事 现在回想起来,其实接触 Git 的时候是在大一的时候表哥带入门的.当时因为需要做一个项目,所以他教如何使用 Git 将写好的代码推送到 GitHub 上,然 ...
- CVPR2020:训练多视图三维点云配准
CVPR2020:训练多视图三维点云配准 Learning Multiview 3D Point Cloud Registration 源代码和预训练模型:https://github.com/zgo ...
- Xshell6会话管理器无意中关闭,在哪里打开
一.进入查看 二.勾选则弹出,然后双击窗口即可
- 包及权限配置&java存储机理绘制
包及权限配置 包的声明和导入 //声明 package aa.bb.cc; public class A{;} class B{;} //即在java输出目录aa.bb.cc中放入编译后的A.clas ...
- 由一次PasswordBox密码绑定引发的疑问 ---> WPF中的附加属性的定义,以及使用。
1,前几天学习一个项目的时候,遇到了PasswordBox这个控件,由于这个控件的Password属性,不是依赖属性,所以不能和ViewModel层进行数据绑定. 2,但是要实现前后端彻底的分离,就需 ...
- java并发编程JUC第九篇:CountDownLatch线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...