1.概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取
2.原生的scrapy是不可以实现分布式式爬虫
a)调度器无法共享
b)管道无法共享
3.scrapy-redis 组件:专门为scrapy开发的一套组件,该组件可以让scrapy实现分布式
a)pip install scrapy-redis
4.分布式爬取的流程:
a)redis配置文件配置
band 127.0.0.1 进行注释
b)redis服务器开启
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
1from scrapy.linkextractors import LinkExtractor 2from scrapy.spiders import CrawlSpider, Rule 3from redispro.items import RedisproItem 4from scrapy_redis.spiders import RedisCrawlSpider 5 6class QiubaiSpider(RedisCrawlSpider): 7 name = 'qiubai' 8 # allowed_domains = ['www.qiushibaike.com'] 9 # start_urls = ['https://www.qiushibaike.com/'] 10 11 #调度器队列的名称 12 redis_key = 'qiubai' # 表示跟start_urls含义是一样 13 link = LinkExtractor(allow=r'/pic/page/\d+') 14 rules = ( 15 Rule(link, callback='parse_item', follow=True), 16 ) 17 18 def parse_item(self, response): 19 div_list = response.xpath('//div[@id="content-left"]/div') 20 for i in div_list: 21 img_url = 'http' + i.xpath('.//div[@class="thumb"]/a/img/@src') 22 item = RedisproItem() 23 item['img_url'] = img_url 24 25 yield item
setting
1#使用scrapy-redis组件的去重队列 2DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" 3#使用scrapy-redis组件自己的调度器 4SCHEDULER = "scrapy_redis.scheduler.Scheduler" 5#是否允许暂停 6SCHEDULER_PERSIST = True 7 8 9#如果redis服务器不在自己本机,则需要如下配置 10REDIS_HOST = "112.21.68.59" 11REDIS_PORT = 6379 12 13ITEM_PIPELINES = { 14# 'redispro.pipelines.RedisproPipeline': 300, 15 'scrapy_redis.pipelines.RedisPipeline':400, 16}