redis分布式部署
- 概念:可以將一組程序執行在多台機器上(分布式機群),使其進行數據的分布爬取。
1.scrapy框架是否可以自己實現分布式?
其一:因為多台機器上部署的scrapy會各自擁有各自的調度器,這樣就使得多台機器無法分配start_urls列表中的url。(多台機器無法共享同一個調度器)
其二:多台機器爬取到的數據無法通過同一個管道對數據進行統一的數據持久出存儲。(多台機器無法共享同一個管道)
2.基於scrapy-redis組件的分布式爬蟲
- scrapy-redis組件中為我們封裝好了可以被多台機器共享的調度器和管道,我們可以直接使用並實現分布式數據爬取。
- 實現方式:
1.基於該組件的RedisSpider類
2.基於該組件的RedisCrawlSpider類
3.分布式實現流程:上述兩種不同方式的分布式實現流程是統一的
- 3.1 下載scrapy-redis組件:pip install scrapy-redis
- 3.2 redis配置文件的配置:
3.3 修改爬蟲文件中的相關代碼:
- 將爬蟲類的父類修改成基於RedisSpider或者RedisCrawlSpider。
注意:如果原始爬蟲文件是基於Spider的,則應該將父類修改成RedisSpider,如果原始爬蟲文件是基於CrawlSpider的,則應該將其父類修改成RedisCrawlSpider。
- 注釋或者刪除start_urls列表,切加入redis_key屬性,屬性值為scrpy-redis組件中調度器隊列的名稱
3.4 在setting中進行相關配置,開啟使用scrapy-redis組件中封裝好的管道
3.5 在setting文件中進行相關配置,開啟使用scrapy-redis組件中封裝好的調度器
3.6 在setting文件中進行爬蟲程序鏈接redis的配置:
3.7 開啟redis服務器:redis-server 配置文件
攜帶配置文件啟動redis服務【windows終端切換到redis文件目錄】
redis-server ./redis.windows.conf
3.8 開啟redis客戶端:【windows終端中輸入】
redis-cli
3.9 運行爬蟲文件:scrapy runspider SpiderFile
pycharm終端進入spider文件目錄,輸入【scrapy runspider xxx.py】
3.10 向調度器隊列中扔入一個起始url(在redis客戶端中操作):lpush redis_key屬性值 起始url
windows終端輸入:lpush ts www.xxx.com
3.11 redis客戶端【redis-cli】中顯示數據【items:xxx】
實例:陽光熱線
# 1.spider文件 import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapyRedisPro.items import ScrapyredisproItem from scrapy_redis.spiders import RedisCrawlSpider class ScrapyredisSpider(RedisCrawlSpider): name = 'scrapyredis' redis_key = 'ts' # 可以被共享的調度器中的隊列名稱 rules = ( Rule(LinkExtractor(allow=r'tupe=4&page=\d+'), callback='parse_item', follow=True), ) def parse_item(self, response): tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr') for tr in tr_list: title = tr.xpath('./td[2]/a[2]/text()').extract_first() net_friend = tr.xpath('./td[4]/text()').extract_first() item = SunlinecrawlItem() item['title'] = title item['net_friend'] = net_friend yield item # 提交的item必須保證提交到可以被共享的管道中 ---------------------------------------------------------------------------------------- # 2.setting文件 BOT_NAME = 'scrapyRedisPro' SPIDER_MODULES = ['scrapyRedisPro.spiders'] NEWSPIDER_MODULE = 'scrapyRedisPro.spiders' USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36' ROBOTSTXT_OBEY = False LOG_LEVEL = 'ERROR' ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline':400, } # 使用scrapy-redis組件的去重隊列 # 增加一個去重容器類的配置,作用是用Redis的set集合來存儲請求的指紋數據,從而實現請求去重的持久化 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis組件自己的調度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 是否允許暫停 # 配置調度器是否要持久化,也就是當爬蟲結束了,要不要清空Redis中請求隊列和去重指紋的set。True:表示要持久化存儲,不清空數據;False清空數據 SCHEDULER_PERSIST = True # 指定ip和port REDIS_HOSR = '127.0.0.1' #【redis服務器ip地址】【真實ip】 REDIS_PORT = 6379 # 當前請求數量【開啟32個線程】 CONCURRENT_REQUESTS = 32 ---------------------------------------------------------------------------------------- # 3.items文件 import scrapy class ScrapyredisproItem(scrapy.Item): title = scrapy.Field() net_friend = scrapy.Field()
對應redis終端指令 開啟redis服務器:redis-server 配置文件 D:\redis>redis-server.exe ./redis.windows.conf 開啟redis客戶端 D:\redis>redis-cli 查看redis數據庫當前數據 127.0.0.1:6379> keys * (empty list or set) 向調度器隊列中扔入一個起始url(在redis客戶端中操作) 127.0.0.1:6379> lpush ts http://wz.sun0769.com/index.php/question/questionType?type=4&page=