scrapy-redis分布式爬虫
Scrapy 是一个通用的爬虫框架,但是不支持分布式,Scrapy-redis是为了更方便地实现Scrapy分布式爬取,而提供了一些以redis为基础的组件(仅有组件)。
一、Scrapy-Redis分布式策略:
Master端
(核心服务器):搭建一个Redis数据库,并开启redis-server,不负责爬取,只负责url指纹判重、Request的分配,以及数据的存储Slaver端
(爬虫程序执行端) :负责执行爬虫程序,运行过程中提交新的Request给Master
二、安装scrapy-redis:
pip3 install scrapy-redis
三、安装Redis数据库
Master端需要安装Redis数据库,可以参照:redis数据库使用
需要注意的是,配置文件redis.conf中需要注释掉bind 127.0.0.1这一行,从而允许Slaver端远程连接。
四、实现Scrapy-Redis分布式爬虫
-
settings.py关键配置
# 指定使用scrapy-redis的调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 指定使用scrapy-redis的去重过滤器 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' #默认情况下,RFPDupeFilter只记录第一个重复请求。将DUPEFILTER_DEBUG设置为True会记录所有重复的请求。 # DUPEFILTER_DEBUG =True # 允许爬虫程序中断恢复后,接着之前的请求继续爬取,而不是从头开始爬 SCHEDULER_PERSIST = True # 指定排序爬取地址时使用的队列 #SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue' 按优先级排序(Scrapy默认),redis数据库中通过有序集合(sorted set)类型实现 # SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue' 按先进先出排序(FIFO) # SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'按后进先出排序(LIFO) # 只在使用SpiderQueue或者SpiderStack时有效,指定爬虫关闭的最大间隔时间 # SCHEDULER_IDLE_BEFORE_CLOSE = 10 ITEM_PIPELINES = { #'example.pipelines.ExamplePipeline': 300, 'scrapy_redis.pipelines.RedisPipeline': 400 #将数据存储到redis数据库,如果自己也实现了Pipeline,切记RedisPipeline后面的数值一定要比前面的大,因为它并不会return item以便后续管道文件处理 } #指定数据库连接参数,默认本地 #REDIS_HOST = 'Master端ip' #REDIS_PORT = 6379 #REDIS_PARAMS ={ # 'password': '密码', #}
-
爬虫文件(spiders/xx.py)
-
RedisSpider爬虫
from scrapy_redis.spiders import RedisSpider #导入爬虫基类 class DemoSpider(RedisSpider): name = '爬虫名' allowed_domains= ['允许的爬虫域'] #redis中存放start_urls的键名,一定要指定 redis_key = 'demospider:start_urls' #即启动爬虫的命令,参考格式:redis_key = '小写类名:start_urls' def parse(self, response): pass
-
RedisCrawlSpider爬虫
from scrapy.spiders import Rule from scrapy.linkextractors import LinkExtractor from scrapy_redis.spiders import RedisCrawlSpider class DemoSpider(RedisCrawlSpider): name = '爬虫名' allowed_domains = ['允许的爬虫域'] redis_key = 'demospider:start_urls' #可任意指定,最好遵循'小写类名:start_urls'这种形式 rules = { Rule(LinkExtractor(), callback='parse_page', follow=True),#callback不能为'parse' ,否则爬虫无法允许 } def parse_page(self,response): pass
-
-
执行方式
-
Slaver端运行爬虫
scrapy crawl 爬虫名
-
Master端Redis数据库中执行以下命令:(参考)
lpush demospider:start_urls http://www.dmoz.org/
-
slaver端爬虫程序获取到url,开始执行,并将结果保存到redis数据库中
- reids数据库中会生成3个键
- 爬虫名:dupefilter 【过滤器】
- 爬虫名:items 【以list保存json结果,比如:{"url": "https://sc.chinaz.com/jianli/240310087271.htm", "title": "测试"}】
- 爬虫名:requests 【请求】
- reids数据库中会生成3个键
-
- 运行中断(ctr+c)
- 再次运行程序时,不需要再次执行lpush xxx了,而会继续爬取
注:如果仅仅想通过redis数据库来进行去重和保存数据,只需按照上述设置settings.py即可,然后使用命令:scrapy crawl 爬虫名 来执行爬虫,切记不需要通过redis数据库客户端lpush指令了