分佈式爬蟲,可讓不少臺電腦都使用同一個的爬蟲程序,將爬蟲分發獲得多臺電腦上,這樣能夠提升爬蟲的速度,也就是分佈式爬蟲。php
分佈式爬蟲須要專門的模塊scrapy-redis,原生的scrapy框架沒法實現分佈式爬取,緣由在於:(1)scrapy框架中五大核心組件中的調度器只歸屬於該項目,沒法實現被分佈式集羣共享;(2)scrapy框架中五大核心組件中的調度器管道只接受該項目的數據對象,沒法實現被分佈式集羣共享。linux
基於scrapy-redis組件的分佈式爬蟲redis
scrapy-redis組件中已經封裝好了能夠被多臺機器共享的調度器和管道,能夠直接使用並實現分佈式數據爬取。要想實現分佈式,必需要有共享的調度器隊列和共享管道爬(爬取的數據必須存儲在redis中,由於是基於scrapy-redis模塊,內置封裝的方法)數據庫
實現方式有兩種: (1)基於該組件的RedisSpider類;(2)基於該組件的RedisCrawlSpider類。windows
分佈式爬取數據案例框架
東莞陽光網(http://wz.sun0769.com/index.php/question/report?page=) dom
1.安裝下載scrapy-redis模塊scrapy
pip install scrapy-redis分佈式
2.建立爬蟲項目(基於CrawlSpider來實現)ide
scrapy startproject fbsPro
cd fbsPro
scrapy genspider -t crawl fbsTest www.xxx.com
3.修改爬蟲文件
1 import scrapy 2 from scrapy.linkextractors import LinkExtractor 3 from scrapy.spiders import CrawlSpider, Rule 4 from fbsPro.items import FbsproItem 5 from scrapy_redis.spiders import RedisCrawlSpider 6 7 8 #分佈式實現不須要依賴scrapy框架提供的起始url調度器和管道 9 #(1)導入scrapy-redis模塊封裝好的類,將爬蟲類的父類指定成RedisCrawlSpider 10 class FbstestSpider(RedisCrawlSpider): 11 name = 'fbsTest' 12 # allowed_domains = ['www.xxx.com'] 13 # start_urls = ['http://www.xxx.com/'] 14 15 # 分佈式爬蟲的起始url是放在共享調度器隊列中的 16 #(2)分佈式實現要指定共享調度器隊列 17 redis_key = 'fbsQueue' # 能夠被共享的調度器隊列的名稱 18 19 #本案例採用CrawlSpider實現自動全站爬取 20 # Rule是規則解析器; 21 # LinkExtractor是鏈接提取器,提取符合allow規則的完整的url; 22 # callback指定當前規則解析器的回調解析函數; 23 # follow指定是否將連接提取器繼續做用到連接提取器提取出的連接網頁; 24 # follow不指定默認False; 25 rules = ( 26 Rule(LinkExtractor(allow=r'page=\d+'), callback='parse_item', follow=True), 27 ) 28 29 def parse_item(self, response): 30 item = FbsproItem() 31 tr_list = response.xpath('//*[@id="morelist"]/div/table[2]/tbody/tr/td/table/tbody/tr') 32 for tr in tr_list: 33 item['identifier'] = tr.xpath('./td[1]/text()').extract_first() # 解析編號 34 item['title'] = tr.xpath('/td[2]/a[2]/text()').extract_first() # 解析標題 35 yield item
4.items.py字段屬性定義
1 import scrapy 2 3 4 class FbsproItem(scrapy.Item): 5 identifier=scrapy.Field() 6 title=scrapy.Field() 7 pass
5.settings.py配置文件
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36" ROBOTSTXT_OBEY = False LOG_LEVEL="ERROR" #(1) 指定管道(自動持久化存儲) ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400 } #(2)指定調度器 # 增長了一個去重容器類的配置, 做用使用Redis的set集合來存儲請求的指紋數據, 從而實現請求去重的持久化 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis組件本身的調度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 配置調度器是否要持久化, 也就是當爬蟲結束了, 要不要清空Redis中請求隊列和去重指紋的set。若是是True, 就表示要持久化存儲, 就不清空數據, 不然清空數據 SCHEDULER_PERSIST = True #(3)指定數據庫 # REDIS_HOST = 'redis服務的ip地址'(注意不能是本機迴環地址,此redis須要共用) REDIS_HOST = '192.168.0.103' REDIS_PORT = 6379
6.配置redis數據庫
修改redis數據庫配置文件:redis.windows.conf(windows)或者redis.conf(linux)
56行註釋:#bind 127.0.0.1
關閉保護模式:protected-mode no
7.指定配置文件啓動redis數據庫服務
redis-server ./redis.windows.conf
8.啓動爬蟲項目(能夠在多臺機器上運行實現分佈式)
進入到爬蟲文件對應的目錄中:scrapy runspider fbsTest.py
9.啓動redis客戶端,向共享調度器隊列放進其實url
redis-cli
lpush fbsQueue http://wz.sun0769.com/index.php/question/report?page= (向在爬蟲文件中指定的)