9.1 scrapy
- 调度器不可以被分布式集群共享
- 管道不可以被分布式集群共享
9.1 scrapy-redis
- 可以给原生的scrapy框架提供可以被共享的管道和调度器
9.2 基本使用方法
-
创建一个项目
scrapy startproject '项目名'
-
创建一个CrawlSpider爬虫文件
cd '项目名' scrapy genspider -t crawl '爬虫文件名' www.xxx.com
-
爬虫文件.py
from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from fbsPro.items import FbsproItem from scrapy_redis.spiders import RedisCrawlSpider class FbsSpider(RedisCrawlSpider): name = 'fbs' # 将start_urls和allowed_domains进行注释 # allowed_domains = ['www.xxx.com'] # start_urls = ['http://www.xxx.com/'] # 添加一个新属性,可以被共享的调度器队列的名称 redis_key = 'sun' # 和CrawlSpider类似 rules = ( Rule(LinkExtractor(allow=r'type=4&page=\d+'), 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: new_num = tr.xpath('./td[1]/text()').extract_first() new_title = tr.xpath('./td[2]/a[2]/@title').extract_first() item = FbsproItem() item['title'] = new_title item['new_num'] = new_num yield item
-
settings.py
# 指定scrapy-redis的管道 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远程服务器的ip(修改) REDIS_PORT = 6379
-
修改redis.conf
# 注释掉bind 127.0.0.1 # IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES # JUST COMMENT THE FOLLOWING LINE. # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # bind 127.0.0.1 # 关闭保护模式 protected-mode no
-
结合着配置文件开启redis服务
./redis-server ../redis.conf
-
启动客户端
./redis-cli
-
执行工程
cd 项目名/spiders scrapy runspider '爬虫文件.py'
-
在客户端的终端,向调度器的队列中放入一个起始的URL
lpush '可以被共享的调度器队列的名称' 'www.xxx.com'
-
爬取到的数据存储在了redis的proName:items这个数据结构中
9.3 redis基本指令
-
客户端
keys * # 查看所有表 lrange proName:items 0 -1 # 查看所有记录 llen proName:items # 查看表中的记录个数 smembers urls # 查看所有记录 # 关闭数据库 redis-cli -p 端口号 shutdown