scrapy-redis 分布式学习记录

学习了scrapy 爬虫框架 以为这个框架作数据抓取很好用,可是不支持分布式。网上查了有大牛在它基础上进行改进出了一个scrapy-redis 的框架
 
在网上找了不少教程,可是都没有说到基于scrapy-redis从 0 搭建分布式 爬虫框架的。
所以我决定本身从 0 开始搭建 并把整个过程记录下来 但愿后来的人少走一些弯路(环境是基于Red Hat Enterprise Linux Server release 7.2 (Maipo), redis 版本是 redis-4.0.1 python 版本是2.7)
 
Master 端的配置以及redis的安装
 
1. 首先这个scrapy-redis 是基于 redis 数据库来实现的分布式 所以 必需要先安装好 redis
如下 操做 是以root 用户来进行
1.1 建立redis 安装目录
mkdir /usr/local/redis
1.2 切换到redis 目录 并下载 redis
cd redis
1.4 解压 并安装 redis
make && make install
1.5 修改redis 的配置(修改redis.conf)默认的redis 监听端口是127.0.0.1 改为你本机的ip
1.6 启动redis (启动的信息会输出到 nohup.out 中)
cd src
nohup ./redis-server ../redis.conf &
 
2. 安装scrapy
pip install scrapy_redis
 
3. 新建一个项目 scrapy startproject MySpider
出现了错误 AttributeError: 'module' object has no attribute 'OP_NO_TLSv1_1'
缘由是 pip 安装时 Twisted默认是安装了最新的 Twisted-17.9.0 把 Twisted 卸载掉 安装一个版本比较低的
3.1 卸载 Twisted
pip uninstall Twisted
3.2 更换其余版本的 Twisted
pip install twisted==15.0.0
3.3 而后再尝试新建项目
scrapy startproject MySpider
3.4 建立好项目以后我须要在spider 目录下面建立一个master.py 这个就是master(负责获取url 并保持到redis的队列中,以供其余的slave 使用)
 
4. 配置scrapy 当咱们创建好项目以后,就须要修改settings.py 文件 在里面添加配置
# redis ip
REDIS_HOST = "192.168.1.52"
# redis 端口
REDIS_PORT = 6379
# 使用redis 存储任务调度
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 使用redis 配置去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# ROBOTSTXT_OBEY = False
5. 编写 master demo (这里须要注意,之前是继承自Spider 可是若是是作分布式的话须要继承自RedisSpider)
   # coding:utf-8
  from scrapy_redis.spiders import RedisSpider


  class Master(RedisSpider):
  """

  """
  name = 'master'
  redis_key = 'master:start_urls'
  allowed_domains = ['baidu.com']

  def parse(self, response):

  print response.body
能够看到我这里并无写start_urls (start_urls 被保存在redis)这也是和scrapy 不一样的地方 里面还写了 redis_key 这个很重要,由于scrapy 就是根据这个key 去 redis 里面查找数据的
 
6. 去redis 里面往队列里面插入数据
[root@localhost src]# ./redis-cli -h 192.168.1.52 -p 6379
192.168.1.52:6379> lpush master:start_urls https://www.baidu.com/
(integer) 1
192.168.1.52:6379>
 
7. 而后就能够将master的demo 运行起来了
7.1 切换到项目路径下面,将master 的脚本运行起来,运行起来后它就会去redis 里面找到start_urls 而后请求该url 返回response
cd mySpider/mySpider
scrapy crawl master
 
7.2 当咱们每次将项目停掉时redis 里面的start_urls 就会被清空(如今还不清楚是为何...估计是以pop的方式从redis 里面拿出来的url)
 
# 到此 Master 节点的demo 已经能够运行起来了,如今咱们须要处理的就是 从master的请求的response 里面 处理数据,并将url 保存至 redis 队列中。而后配置其余节点的scrapy 让其余节点的进程从redis 里面拿出url 进行抓取
 
配置其余节点
1 其余的节点也须要安装scrapy-redis 不须要安装redis 只须要将setting的配置文件加上一条配置
REDIS_URL = 'redis://192.168.1.52:6379'
 
如下是 slave 的爬虫文件demo
# coding:utf-8

  from scrapy_redis.spiders import RedisSpider


  class Slave1(RedisSpider):
  """

  """
  name = 'slave1'
  # redis_key 必须和 master 同样
  redis_key = 'master:start_urls'
  allowed_domains = ['baidu.com']

  def parse(self, response):
   print response.body
 
而后就能够运行slave 了,当master 拿到url 保存到redis里面的时候,这里就会自动拿到url 而后你只须要在这里处理数据就能够了