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, }