redis是不支持Windows鹦筹,只支持linux照卦。有人開發(fā)了一套爬范,可以直接使用
windows下的配置:
bind 127.0.0.1將這一行注釋起來
protected_mode no 將yes修改為no即可
redis的可視化工具:redis desktop manager
分布式部署:
實(shí)現(xiàn)多臺電腦共同爬取
scrapy支持分布式嗎痪宰?不支持分布式
怎么辦?
有人開發(fā)了一套基于scrapy的組件scrapy-redis矾瑰,通過這套組件寫的代碼就可以實(shí)現(xiàn)分布式
https://github.com/rmax/scrapy-redis
scrapy-redis不是框架砖茸,是一套基于scrapy的組件
安裝:
pip install scrapy-redis
添加起始url
lpush qingspider:start_urls 起始的url
執(zhí)行:
scrapy runspider xxx.py
下面是關(guān)于spider 和crawlspider的官方重寫方法
redisspider的方法:
from scrapy_redis.spiders import RedisSpider
'''
如果以前你的scrapy是通過Spider寫的
現(xiàn)在你要實(shí)現(xiàn)分布式,參考這個(gè)模板即可
'''
class MySpider(RedisSpider):
"""Spider that reads urls from redis queue (myspider:start_urls)."""
name = 'myspider_redis'
# start_url
redis_key = 'myspider:start_urls'
# 構(gòu)造方法殴穴,初衷非常好凉夯,想用這個(gè)方法動(dòng)態(tài)定義允許域名列表货葬,然后就不用allowed_domains
# 實(shí)際操作,是一個(gè)坑劲够,這個(gè)方法不能使用震桶,還得使用allowed_domains
def __init__(self, *args, **kwargs):
# Dynamically define the allowed domains list.
domain = kwargs.pop('domain', '')
self.allowed_domains = filter(None, domain.split(','))
super(MySpider, self).__init__(*args, **kwargs)
def parse(self, response):
return {
'name': response.css('title::text').extract_first(),
'url': response.url,
}
rediscrawlspider的方法:
from scrapy.spiders import Rule
from scrapy.linkextractors import LinkExtractor
from scrapy_redis.spiders import RedisCrawlSpider
'''
如果以前你的scrapy是通過CrawlSpider寫的
現(xiàn)在你要實(shí)現(xiàn)分布式,參考這個(gè)模板即可
'''
class MyCraw'''
如果以前你的scrapy是通過Spider寫的
現(xiàn)在你要實(shí)現(xiàn)分布式征绎,參考這個(gè)模板即可
'''ler(RedisCrawlSpider):
"""Spider that reads urls from redis queue (myspider:start_urls)."""
name = 'mycrawler_redis'
redis_key = 'mycrawler:start_urls'
rules = (
# follow all links
Rule(LinkExtractor(), callback='parse_page', follow=True),
)
# 構(gòu)造方法蹲姐,初衷非常好,想用這個(gè)方法動(dòng)態(tài)定義允許域名列表人柿,然后就不用allowed_domains
# 實(shí)際操作柴墩,是一個(gè)坑,這個(gè)方法不能使用凫岖,還得使用allowed_domains
def __init__(self, *args, **kwargs):
# Dynamically define the allowed domains list.
domain = kwargs.pop('domain', '')
self.allowed_domains = filter(None, domain.split(','))
super(MyCrawler, self).__init__(*args, **kwargs)
def parse_page(self, response):
return {
'name': response.css('title::text').extract_first(),
'url': response.url,
}
settings.py的配置
SPIDER_MODULES = ['example.spiders']
NEWSPIDER_MODULE = 'example.spiders'
USER_AGENT = 'scrapy-redis (+https://github.com/rolando/scrapy-redis)'
# 去重類
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 調(diào)度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 允許暫停
SCHEDULER_PERSIST = True
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
# redis管道 開啟管道江咳,寫入redis,默認(rèn)是寫到本機(jī)redis服務(wù)中
'scrapy_redis.pipelines.RedisPipeline': 400,
}
# 配置寫入其它機(jī)器redis服務(wù)
REDIS_HOST = '10.0.1.1'
REDIS_PORT = 6379
LOG_LEVEL = 'DEBUG'
# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
DOWNLOAD_DELAY = 1
如果你想繼續(xù)用你的settings.py文檔哥放,那怎么定制你的分布式的settings的配置呢歼指?
在你的爬中文件類中寫:
custom_settings = {
# 去重類
'DUPEFILTER_CLASS': "scrapy_redis.dupefilter.RFPDupeFilter",
# 調(diào)度器
'SCHEDULER': "scrapy_redis.scheduler.Scheduler",
# 允許暫停
'SCHEDULER_PERSIST': True,
'ITEM_PIPELINES': {
'scrapy_redis.pipelines.RedisPipeline': 400,
},
# 配置寫入其它機(jī)器redis服務(wù)
'REDIS_HOST': '10.0.120.89',
'REDIS_PORT': '6379',
'DOWNLOAD_DELAY': 1,
}
其他的和spider和crawlspider一樣寫即可