单机版使用scrapy-redis
1.使用原因:主要是为了去重及使用redis数据库保证下载requests的完整性,可以断点续传,因为没有下载完成的request会保存在redis数据库里
指定使用scrapy-redis的调度器
SCHEDULER = “scrapy_redis.scheduler.Scheduler”
指定使用scrapy-redis的去重
DUPEFILTER_CLASS = ‘scrapy_redis.dupefilter.RFPDupeFilter’
指定排序爬取地址时使用的队列,
默认的 按优先级排序(Scrapy默认),由sorted set实现的一种非FIFO、LIFO方式。
SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderQueue’
可选的 按先进先出排序(FIFO)
SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderQueue’
可选的 按后进先出排序(LIFO)
SCHEDULER_QUEUE_CLASS = ‘scrapy_redis.queue.SpiderStack’
在redis中保持scrapy-redis用到的各个队列,从而允许暂停和暂停后恢复,也就是不清理redis queues
SCHEDULER_PERSIST = True
只在使用SpiderQueue或者SpiderStack是有效的参数,指定爬虫关闭的最大间隔时间
SCHEDULER_IDLE_BEFORE_CLOSE = 10
通过配置RedisPipeline将item写入key为 spider.name : items 的redis的list中,供后面的分布式处理item
这个已经由 scrapy-redis 实现,不需要我们写代码
ITEM_PIPELINES = {
#‘distribute_country.pipelines.DistributeCountryPipeline’:300,
‘scrapy_redis.pipelines.RedisPipeline’: 400
}
DOWNLOADER_MIDDLEWARES = {
‘distribute_country.middlewares.SeleniumMiddleware’: 543,
}
指定redis数据库的连接参数
REDIS_PASS是我自己加上的redis连接密码(默认不做)
REDIS_HOST = ‘127.0.0.1’
REDIS_PORT = 6379
#REDIS_PASS = ‘redisP@ssw0rd’
LOG等级
LOG_LEVEL = ‘DEBUG’
#默认情况下,RFPDupeFilter只记录第一个重复请求。将DUPEFILTER_DEBUG设置为True会记录所有重复的请求。
DUPEFILTER_DEBUG =True
分布式版scrapy-redis
1.修改settings.py文件,参考单机版scrapy-redis
2.继承关系改为如下代码(继承RedisSpider)
from scrapy_redis.spiders import RedisSpider
class LabscrapySpider(RedisSpider):
name = ‘labscrapy’
allowed_domains = [‘lab.scrapyd.cn’]
redis_key = “lab:labspider”
# start_urls = [‘http://lab.scrapyd.cn/’]
3.添加redis-key作为订阅器(subscribe),类似于redis数据库中的channel
redis_key = “lab:labspider”
4.在redis数据库中向redis_key指定的list中推送开始网址,使爬虫开始下载lpush lab:labspider http://lab.scrapyd.cn/