目錄redis
1.scrapy框架是否能夠本身實現分佈式?服務器
- 不能夠。緣由有二。 其一:由於多臺機器上部署的scrapy會各自擁有各自的調度器,這樣就使得多臺機器沒法分配start_urls列表中的url。(多臺機器沒法共享同一個調度器) 其二:多臺機器爬取到的數據沒法經過同一個管道對數據進行統一的數據持久出存儲。(多臺機器沒法共享同一個管道)
2.基於scrapy-redis組件的分佈式爬蟲框架
- scrapy-redis組件中爲咱們封裝好了能夠被多臺機器共享的調度器和管道,咱們能夠直接使用並實現分佈式數據爬取。 - 實現方式: 1.基於該組件的RedisSpider類 2.基於該組件的RedisCrawlSpider類
3.分佈式實現流程:上述兩種不一樣方式的分佈式實現流程是統一的scrapy
3.1 下載scrapy-redis組件:pip install scrapy-redis分佈式
3.2 redis配置文件的配置:ide
- 註釋該行:bind 127.0.0.1,表示能夠讓其餘ip訪問redis - 將yes該爲no:protected-mode no,表示能夠讓其餘ip操做redis
3.3 修改爬蟲文件中的相關代碼:url
- 將爬蟲類的父類修改爲基於RedisSpider或者RedisCrawlSpider。注意:若是原始爬蟲文件是基於Spider的,則應該將父類修改爲RedisSpider,若是原始爬蟲文件是基於CrawlSpider的,則應該將其父類修改爲RedisCrawlSpider。 - 註釋或者刪除start_urls列表,切加入redis_key屬性,屬性值爲scrpy-redis組件中調度器隊列的名稱
3.4 在配置文件中進行相關配置,開啓使用scrapy-redis組件中封裝好的管道code
ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400 }
3.5 在配置文件中進行相關配置,開啓使用scrapy-redis組件中封裝好的調度器server
# 使用scrapy-redis組件的去重隊列 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis組件本身的調度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 是否容許暫停 SCHEDULER_PERSIST = True
3.6 在配置文件中進行爬蟲程序連接redis的配置:隊列
REDIS_HOST = 'redis服務的ip地址' REDIS_PORT = 6379 REDIS_ENCODING = ‘utf-8’ REDIS_PARAMS = {‘password’:’123456’}
3.7 開啓redis服務器:redis-server 配置文件
3.8 開啓redis客戶端:redis-cli
3.9 運行爬蟲文件:scrapy runspider SpiderFile
3.10 向調度器隊列中扔入一個起始url(在redis客戶端中操做):lpush redis_key屬性值 起始url