分布式集群之redis数据库操作

如果采用redis数据库集群操作方式爬取数据源,那么爬虫客户端最好设置redis数据库的密码,否则对方将无法进行数据库链接操作,并且会报未知错误。

redis-cli -h 192.168.1.53 -p 6379 -a 12345   (依次是 目标主机地址,端口号,对方数据库密码) 如此能确保集群的正常拼通

如果执行分布式爬取操作:lpush  readspider:start_urls https://www.qidian.com/allorderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=1

如果出现爬取页面url与请求url冲突,则可以设置settings下的配置:

 

SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None,
}

 将crawlspider改写为分布式爬虫的实现:

from scrapy_redis.spiders import RedisCrawlSpider

首先导入分布式redis爬虫类

1.首先将爬虫文件的继承类由 crawl spider改写为RedisCrawlSpider

2.此时继承类不在支持allowed_domainsstart_urls这两个配置参数,直接注释掉

3.redis_key='当前类名:start_urls'替代start_urls,作为程序的启动执行指令。

4.动态域范围获取的初始化方法,固定格式,且必须实现

 #动态域范围获取
    def __init__(self,*args,**kwargs):
        domain=kwargs.pop('domain','')
        self.allowed_domains=filter(None,domain.split(','))
        super(ReadSpider,self).__init__(*args,**kwargs)

爬虫文件修改完成,对配置文件settings进行设置

# 使用scrapy-redis里的去重组件,不使用scrapy默认的去重方式
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis里的调度器组件,不使用默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 允许暂停,redis请求记录不丢失
SCHEDULER_PERSIST = True

# 默认的scrapy-redis请求队列形式(按优先级)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 队列形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
# 栈形式,请求先进后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"

# LOG_LEVEL = 'DEBUG'

在settings里指定数据库的配置:

# 指定数据库的主机IP
REDIS_HOST = "127.0.0.1"
# 指定数据库的端口号
REDIS_PORT = 6379
#数据库密码
REDIS_PARAMS = {'password': '123456'}

最好默认就将上文提到的spider_middlewares中间件开启,并安上述配置为None

SPIDER_MIDDLEWARES = {
    'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': None,
}

最后在管道文件添加scrapy_redis的管道类

ITEM_PIPELINES = {
   'qd.pipelines.QdPipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

至此爬虫修改完成。

执行流程:进入当前项目的爬虫文件目录下,执行 scrapy runspider read.py

爬虫将被唤醒,处于阻塞状态,监听指定数据库的IP和端口,

redis数据库发送指令:

lpush  readspider:start_urls https://www.qidian.com/allorderId=&style=1&pageSize=20&siteid=1&pubflag=0&hiddenField=0&page=1

爬虫启动,开始采集数据。

*************************************************************************************

如果想实现两台或者多台计算机的分布式爬虫策略:

若客户端还没有爬虫项目,且爬虫项目已经在其他主机上开发完成,则可以直接远程推送给客户端。

1.将爬虫项目打成tar包 :tar -cvf qidian.tar.gz qidian    qidian.tar

2.连接至客户端:sftp 用户名@IP地址    -----> sftp lisa@192.168.1.53

3.输入客户端用户的密码,连接成功

4. ls查看客户端下当前目录,lls查看本机所在目录。

5.发包到客户端 put qidian.tar

6.客户端解包项目:tar -xvf qidian.tar

那么客户端就可以部署项目了,部署时一定要更改成当前redis的IP和端口

关于redis数据库服务:若是没有关闭远程保护,会禁止客户端的远程连接:在redis server xxx.cfg配置文件里

protected-mode配置项设为no,注意 要在配置文件中修改,若直接在客户端中通过config set protected-mode no命令修改,只对本次有效,redis-server重启后,还是为yes

原文地址:https://www.cnblogs.com/wen-kang/p/10585797.html