1.概念:多臺機器上能夠執行同一個爬蟲程序,實現網站數據的分佈爬取redis
2.原生的scrapy是不能夠實現分佈式式爬蟲服務器
a)調度器沒法共享dom
b)管道沒法共享scrapy
3.scrapy-redis 組件:專門爲scrapy開發的一套組件,該組件能夠讓scrapy實現分佈式分佈式
a)pip install scrapy-rediside
4.分佈式爬取的流程:網站
a)redis配置文件配置url
band 127.0.0.1 進行註釋spa
b)redis服務器開啓code
c)建立scrapy工程後,建立基於crawlspider的爬蟲文件
d) 導入RedisCrawlSpider類,而後將爬蟲文件修改爲基於該類的源文件
e)將start_url 修改爲 redis_key="xxx"
f )將項目管道和調度器配置成基於scrapy-redis組件中
g)執行爬蟲文件:scrapy runspider xxx.py
h)將起始url放置到調度器的隊列中:redis-cli,lpush 隊列的名稱(redis-key)起始url
from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from redispro.items import RedisproItem from scrapy_redis.spiders import RedisCrawlSpider class QiubaiSpider(RedisCrawlSpider): name = 'qiubai' # allowed_domains = ['www.qiushibaike.com'] # start_urls = ['https://www.qiushibaike.com/'] #調度器隊列的名稱 redis_key = 'qiubai' # 表示跟start_urls含義是同樣 link = LinkExtractor(allow=r'/pic/page/\d+') rules = ( Rule(link, callback='parse_item', follow=True), ) def parse_item(self, response): div_list = response.xpath('//div[@id="content-left"]/div') for i in div_list: img_url = 'http' + i.xpath('.//div[@class="thumb"]/a/img/@src') item = RedisproItem() item['img_url'] = img_url yield item
setting
#使用scrapy-redis組件的去重隊列 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" #使用scrapy-redis組件本身的調度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" #是否容許暫停 SCHEDULER_PERSIST = True #若是redis服務器不在本身本機,則須要以下配置 REDIS_HOST = "112.21.68.59" REDIS_PORT = 6379
ITEM_PIPELINES = { # 'redispro.pipelines.RedisproPipeline': 300, 'scrapy_redis.pipelines.RedisPipeline':400, }