scrapy是一个通用的爬虫框架,不支持分布式
scrapy_redis就是为实现scrapy的分布式而诞生的,它里面提功了redis的组件,通过这些redis组件,就可以实现分布式
1、环境部署
scrapy: 爬虫运行的基础 (如果服务端不参与分布式的爬取可以不装)
scrapy_redis :组件(也可以认为是scrapy和redis交互的中间件),用于把scrapy爬虫和redis数据库联系起来
redis服务器:用于存储分布式爬虫爬取到的数据,一般情况下我们将redis服务器部署在Linux系统上,Windows上也可安装(但是这个服务不能用于生产环境);无论是在Linux上还是在Windows上,都必须配置其能够远程访问
1)Linux下安装:
tar -zxvf redis-3.2.8.tar.gzcp -r ./redis-3.2.8 /usr/local/redis (如果被拒绝,用sudo cp ...)
sudo make install
如果有错,请输入指令:sudo make MALLOC=libc
运行起来服务器:进入src文件 cd /usr/local/redis/src 运行redis-server文件 ./redis-server
服务器启动以后,该redis数据就可以处理数据了;操作该数据库需要打开其客户端
另开一个终端 进入src文件 cd /usr/local/redis/src 运行redis-cli文件 ./redis-cli
127.0.0.1:6379>ping
PONG 说明服务器打开成功
关闭服务器 在客户端输入命令:shutdown [nosave|save]
2)远程访问
远程访问:redis-cli -h xxx.xx.xx.xx -port 6379 -a password
# 设置远程访问windows中redis.windows.conf 文件更改 linux中redis.conf文件中更改# protected-mode后的yes改为no
# 找到bind 127.0.0.1注释掉(或改为0.0.0.0)
# 开放端口6379(防火墙、阿里云安全策略。。。)
redis-cli -h xxx.xx.xx.xx# 设置密码
# 找到requirepass一行,去掉注释 设置密码(requirepass 密码)
3、在普通的scrapy爬虫框架下去爬取,保证爬虫爬取的数据没有错误再去分布式系统上部署
测试数据格式是否正确
先测:json 目的主要是看代码是否有误 【比如:用xpath的时候路径写错等】
再测redis 目的主要是看一下有木有系统级的错误 【如:redis服务器崩溃】
4、部署分布式
服务器端(master端):
可以用某一台主机作为redis服务器的运行方(即服务端),也称为master
客户端(slaver端):
1)修改自己配置文件,即在配置文件中加上scrapy_redis的组件
settings.py
ITEM_PIPELINES = {
'CrawlSpiderDemo.pipelines.CrawlspiderdemoPipeline': 300,
# 优先级要高于原本的优先级
'scrapy_redis.pipelines.RedisPipeline': 200,
}
#【redis的组件】用于scrapy
# 使用的是scrapy_redis的去重类
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 调度器使用是scrapy_redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 爬取的过程中是否允许暂停
SCHEDULER_PERSIST = True
REDIS_HOST = 'xxx.xxx.xxx.xxx'
REDIS_PORT = 6379
爬虫.py
# 从scrapy_redis.spiders 中 导入 RedisCrawlSpider
from scrapy_redis.spiders import RedisCrawlSpider
# 继承的父类改为RedisCrawlSpider
class DushuSpider(RedisCrawlSpider):
name = 'dushu'
allowed_domains = ['dushu.com']
# 把起始链接注释
# start_urls = ['http://www.baidu.com']
# 增加redis_key
redis_key = "book:start_urls"
# 这个就是页面的url的匹配规则,我们通过他可以很方便的把我们要爬取的页面匹配出来
rules = (
Rule(LinkExtractor(allow=r'/book/1163_\d+\.html'), callback='parse_item', follow=True),
)
# slaver端:首先要运行起来,等待master发出起始地址再开始
进入爬虫文件所在的目录下 执行 scrapy runserver 爬虫.py
# master端:客户端执行完之后redis服务器中放入一个起始地址的列表
lupsh book:start_urls http://www.baidu.com