Scrapy_redis在scrapy的基础上实现了更多,更强大的功能,具体体现在:reqeust去重,爬虫持久化,和轻松实现分布式,安装命令如下:
pip3 install scrapy-redis
Scrapy-redis提供了下面四种组件:
1.Scheduler
2.Duplication Filter
3.Item Pipeline
4.Base Spider
Scrapy本身不支持爬虫分布式,scrapy-redis 的解决是把这个Scrapy queue换成redis数据库,从同一个redis-server存放要爬取的request,便能让多个spider去同一个数据库里读取。
Scheduler
注意!
原来的Scheduler已经无法使用,所以使用Scrapy-redis的scheduler组件。
Duplication Filter
Scrapy中用集合实现这个request去重功能,Scrapy中把已经发送的request指纹放入到一个集合中,把下一个request的指纹拿到集合中比对,如果该指纹存在于集合中,说明这个request发送过了,如果没有则继续操作。
Item Pipeline
引擎将Spider返回的爬取到的Item给Item Pipeline,scrapy-redis 的Item Pipeline将爬取到的 Item 存⼊redis的 items queue。
Base Spider
不在使用scrapy原有的Spider类,重写的RedisSpider继承了Spider和RedisMixin这两个类,RedisMixin是用来从redis读取url的类。
要实现分布式爬虫,需要在settings中做如下设置
Scrapy settings for example project
#
# For simplicity, this file contains only the most important settings by
# default. All the other settings are documented here:
#
# http://doc.scrapy.org/topics/settings.html
#
SPIDER_MODULES = ['example.spiders']
NEWSPIDER_MODULE = 'example.spiders'
# 默认的User-Agent
USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
#这里表示启用scrapy-redis里的去重组件,
不再使用scrapy默认的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
#使用了scrapy-redis里面的调度器组件,不再使用scrapy默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
#允许暂停,redis请求的记录不会丢失,不清除
Redis队列,可以恢复和暂停
SCHEDULER_PERSIST = True
#下面这些是request的队列模式
#一般情况下使用第一种
#scrapy-redis默认的请求队列形式(有自己的优先级顺序)
#是按照redis的有序集合排序出队列的
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
#这个是启用了堆的形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
#使用了栈的形式,请求先进后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
# scrapy_redis.pipelines.RedisPipeline 必须启用,才能够将数据存储到redis数据库中
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
# log日志等级(可选)
# LOG_LEVEL = 'DEBUG'
# 指定要存储的redis的主机的ip,
默认存储在127.0.0.1
REDIS_HOST = 'redis的主机的ip'
# 定要存储的redis的主机的port,
默认6379
REDIS_PORT = '6379'
# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
#下载延时
DOWNLOAD_DELAY = 1