分布式
-
概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取。
-
原生的scrapy是无法实现分布式
- 调度器无法被共享
- 管道无法被共享
-
基于 scrapy+redis(scrapy&scrapy-redis组件)实现分布式
-
scrapy-redis
组件作用:- 提供可被共享的管道和调度器
-
环境安装:
pip install scrapy-redis
-
编码流程:
1.创建工程 2.cd proName 3.创建crawlspider的爬虫文件 4.修改一下爬虫类: - 导包:from scrapy_redis.spiders import RedisCrawlSpider - 修改当前爬虫类的父类:RedisCrawlSpider - allowed_domains和start_urls删除 - 添加一个新属性:redis_key = 'xxxx'可以被共享的调度器队列的名称 5.修改配置settings.py - 指定管道 ITEM_PIPELINES = { 'scrapy_redis.pipelines.RedisPipeline': 400 } - 指定调度器 增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 使用scrapy-redis组件自己的调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据 SCHEDULER_PERSIST = True - 指定redis数据库 REDIS_HOST = '127.0.0.1' REDIS_PORT = 6379 6.配置redis数据库(redis.windows.conf) - 关闭默认绑定 - 56Line:#bind 127.0.0.1 - 关闭保护模式 - 75line:protected-mode no 7.启动redis服务(携带配置文件)和客户端 - redis-server.exe redis.windows.conf - redis-cli 8.执行工程 - scrapy runspider spider.py 9.将起始的url仍入到可以被共享的调度器的队列(sun)中 - 在redis-cli中操作:lpush sun www.xxx.com 10.redis: - xxx:items:存储的就是爬取到的数据
爬虫代码:
# -*- coding: utf-8 -*- import scrapy from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from scrapy_redis.spiders import RedisCrawlSpider from fbsPro.items import FbsproItem class FbsSpider(RedisCrawlSpider): name = 'fbs' # allowed_domains = ['www.xxx.com'] # start_urls = ['http://www.xxx.com/'] redis_key = 'sun' # 可以被共享的调度器队列的名称 link = LinkExtractor(allow=r'type=4&page=d+') rules = ( Rule(link, callback='parse_item', follow=True), ) def parse_item(self, response): tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr') for tr in tr_list: title = tr.xpath('./td[2]/a[2]/@title').extract_first() status = tr.xpath('./td[3]/span/text()').extract_first() item = FbsproItem() item['title'] = title item['status'] = status yield item