使用流程
Redis基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵;
MySQL基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高;
大多数的应用场景是MySQL(主)+Redis(辅),MySQL做为主存储,Redis用于缓存,加快访问速度。需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。存储数据在MySQL和Redis之间做同步;
'''[终端]cd到目录'''
'''[终端]vi redis.conf 利用vim修改配置'''
【修改内容】
1. bind 127.0.0.1 注释掉(否则只运行本机进行链接)
2. protected-mode no 关闭保护模式 改为no
- 基于配置文件进行开启redis
终端: cd到目下的src文件
./redis-server ../redis.conf
- 客户端链接
终端:
redis-cli
如何强制关闭sever服务
终端 sudo pkill redis-server
- 创建项目
scrapy startproject 工程名 (创建项目)
- 创建crawlSpider爬虫
scrapy genspider -t crawl 爬虫名 起始url
至此已做好前期准备工作
setting配置
- 其他电脑上爬必须配置redis!!
# 19行 请求身份伪装user_agent 定义
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
# 22行 是否遵从robots协议(君子协议)
ROBOTSTXT_OBEY = False
# redis管道配置
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400,
# 'redisPro.pipelines.RedisproPipeline': 300,
}
# redis调度器配置
# 使用scrapy-redis组件的去重队列
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
# 使用scrapy-redis组件自己的调度器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
# 是否允许暂停,以外关机后,重新开继续爬
SCHEDULER_PERSIST = True
# 注意!!!
# 如果redis数据库服务器不在本机,那么需要配置~~
# REDIS_HOST = 'redis服务器ip'
# REDIS_PORT = 6379
代码
# 父类替换
from scrapy_redis.spiders import RedisCrawlSpider # 父类替换
from redisPro.items import RedisproItem # 自己定义的item类
class QiubaiSpider(RedisCrawlSpider): # 父类改为 RedisCrawlSpider
name = 'qiubai'
# 调度器队列名称
redis_key = 'qiubaispider' # 和 start_urls同理
# 正则链接分页 提取器
link = LinkExtractor(allow=r'/pic/page/\d+')
# 规则解析器接收到链接提取器的链接,后对链接发起请求,获取内容根据规则进行解析
# follow参数:是否自动在 被提取的页面中继续提 (自动去重)
rules = (
Rule(link, callback='parse_item', follow=True),
)
def parse_item(self, response):
div_list = response.xpath('//div[@id="content-left"]/div')
for div in div_list:
img_url = 'https:' + div.xpath('.//div[@class="thumb"]/a/img/@src').extract_first()
item = RedisproItem()
item['img_url'] = img_url
# 原始的scrapy管道不支持分布式!!!
# 用redis框架封装的管道!!!和调度器!! 在setting中配置
yield item
1. 执行分布爬虫方法
【终端】cd到
cd 项目/spiders/
【终端】允许爬虫的py文件
scrapy runspider 爬虫文件.py
执行后等待调度器分配
2. 把url扔到调度器队列
【终端】【redis客户端连接上后】
lpush 调度器队列名(爬虫中设定的) 起始url