1.概念:多台机器上可以执行同一个爬虫程序,实现网站数据的分布爬取。
2.原生的scrapy 是不可以实现分布式爬虫?
a) 调度器无法共享
b) 管道无法共享
3. scrapy-redis 组件:专门为scrapy 开发的一套组件。该组件可以让scrapy 实现分布式
a) 下载:pip install scrapy-redis
4.分布式爬取的流程
a) redis配置文件的配置
i. bind 127.0.0.1 进行注释
ii. project-mode no 关闭保护模式
b) redis 服务器的开启:基于配置配置文件
c) 创建scrapy工程后,创建基于crawlSpider的爬虫文件
d) 导入RedisCrawlSpider类,然后将爬虫文件修改成基于改类的源文件
e) 将start_url修改成redis_key = "xxx" (此名字用于redis lpush name value) #name:xxx value:start_url # keys * #查看数据 lrange name:items 0 -1 第一行看到最后一行
、
f) 将项目的管道和调度器配置成基于scrapy-redis组建中
g) 执行爬虫文件:scrapy runspider qiubai.py (运行py文件进入listen状态)
h) 将起始url 放到调度器的队列中: redis-cli : lpush列表的名称(redis-key) 起始url
spider/qiubai.py
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from handle4.items import Handle4Item from scrapy_redis.spiders import RedisCrawlSpider # 注意方法 class QiubaiSpider(RedisCrawlSpider): name = \'qiubai\' # allowed_domains = [\'www.qiushibaike.com/pic\'] # start_urls = [\'https://www.qiushibaike.com/pic/\'] redis_key = "qiubaispider" link = LinkExtractor(allow=r\'www.qiushibaike.com/pic/page/\d+?\') rules = ( Rule(link, callback=\'self.parse_item\', follow=True), ) def parse_item(self, response): div_list = response.xpath(\'//*[@id="content"]/div\') for div in div_list: item = Handle4Item() img_url = \'https:\' + div.xpath(\'//div[@class="thumb"]/a/img/@src\').extract_first() item["img_url"] = img_url yield item # return i