天天看点

scrapy爬虫框架中基于redis分布式,数据存储mysql中

redis分布式介绍

  1. 什么是分布式

    一个系统分为很多个子系统,这些子系统相互配合完成整个的业务逻辑叫做分布式,分布式中每一个节点都可以配置集群。

  2. Redis 是一个基于内存的高性能key-value数据库。
  3. redis 特点和优势

    (1)特点:

  • Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
  • Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。
  • Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

    (2)优势:

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

搭建分布式爬虫

  1. 安装scrapy_redis库;

    命令:

pip install scrapy_redis
           
  1. 导包,修改爬虫项目中爬虫文件的类的继承,并且类需要继承自RedisSpider;

原来代码:

class XiaohuaSpider(scrapy.Spider):
	pass
           

修改后为:

from scrapy_redis.spiders import RedisSpider
class XiaohuaSpider(RedisSpider):
	pass
           
  1. 将爬虫文件的类的属性start_urls注释掉,并添加redis_key = “任意名称”;

    代码:

# start_urls = ['http://www.xiaohuar.com/list-1-0.html']
redis_key = "xiaohua1"
           
  1. 修改爬虫文件的类的属性custom_settings,并添加配置信息;
custom_settings = {
        "ROBOTSTXT_OBEY": False,
        "CONCURRENT_REQUESTS": 16,
        "DOWNLOAD_DELAY": 1,
        "COOKIES_ENABLED": False,
        "ITEM_PIPELINES": {
            # Store scraped item in redis for post-processing. 分布式redispipeline
            'scrapy_redis.pipelines.RedisPipeline': 299,
            # 将爬取的数据存储到mysql中,定义管道文件
            'xiaohuaSqider.pipelines.MySQLTwistedPipeline': 300,
        },
        """ scrapy-redis配置 """
        # Enables scheduling storing requests queue in redis.
        "SCHEDULER": "scrapy_redis.scheduler.Scheduler",
        # Ensure all spiders share same duplicates filter through redis.
        "DUPEFILTER_CLASS": "scrapy_redis.dupefilter.RFPDupeFilter",
        "REDIS_HOST": "192.168.4.193",  # 本机ip
        "REDIS_PORT": "6379"  # redis端口号,默认6379
    }
           
  1. 修改redis中的redis.windows.conf文件内容;
    scrapy爬虫框架中基于redis分布式,数据存储mysql中
    新安装的redis默认状态下,是bind 127.0.0.1 或者bind localhost,修改为本机ip地址,如(bind 192.168.4.193)
  • 原先配置:
    scrapy爬虫框架中基于redis分布式,数据存储mysql中
  • 修改结果:
    scrapy爬虫框架中基于redis分布式,数据存储mysql中
    注意:修改过后,redis.windows.conf文件,一定要重新启动redis服务。重启步骤
  1. 对mysql添加远程访问用户;
  • 创建数据库用户(用户权限为 % 让从服务器能访问该数据库,注意:sql语句 % 两端需要加引号):
grant all privileges on *.* to '用户名'@'%'  identified by '密码';
           
  • 刷新数据库权限:
flush privileges;
           
  1. 启动redis服务,设置redis主从;
redis-cli.exe -h 192.168.4.193 -p 6379
           
  • 其中192.168.4.193表示本机ip,6379表示端口号。
  • 让从服务器连接
lpush redis_key的值 网址
           
  1. 运行爬虫项目

    分布式用到的代码应该是同一套代码

    1) 先把项目配置为分布式

    2) 把项目拷贝到多台服务器中

    3) 把所有爬虫项目都跑起来

    4) 在redis中lpush你的网址即可

    5) 效果:所有爬虫都开始运行,并且数据还都不一样