Scrapy-Redis分布式爬虫学习

Scrapy-Redis分布式爬虫组件

  • scrapy是一个框架,它本身不支持分布式的。如果我们想要做分布式的爬虫,就需要借助一个组件叫做Scrapy - Redis,这个组件正是利用了Redis可以分布式的功能,集成到Scrapy框架中,使得爬虫进行分布式。可以充分的利用资源(多个ip、更多带宽、同步爬取)来提高爬虫的爬行效率。

分布式爬虫的优点:

  1. 可以充分利用多台机器的带宽。
  2. 可以充分利用多台机器的ip地址。
  3. 多台机器做,爬取效率更高

分布式爬虫必须要解决的问题:

  1. 分布式爬虫是好几台机器在同时进行,如何保证不同的机器爬取页面的时候不会出现重复爬取的问题。
  2. 同样,分布式爬虫在不同的机器上进行,再把数据爬完后如何保证保存在同一个地方。

安装:

通过pip install scrapy-redis即可安装。

redis教程

概述

  • redis是一种支持分布式的·nosql数据库,他的数据是保存在内存中,同时redis可以定时把数据同步到磁盘,既可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted[有序集合],hash(hash表))。

redis使用场景:

  1. 登录会话存储:存储在redis中,与memcached相比,数据不会丢失。
  2. 排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名主播排名。还有一些文章阅读量的技术,或者是新浪微博的点赞数等。
  3. 作为消息队列:比如celery就是使用redis作为中间人。
  4. 当前在线人数:还是之前的秀场的例子,会显示当前系统有多少人在线。
  5. 一些常用的数据缓存:比如我们的bbs论坛,板块不会经常变化的。但是每次访问首页都是要从mysql中获取,可以在redis中缓存起来,不用每次请求数据库。
  6. 把前200篇文章缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应的评论缓存下来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。
  7. 好友关系:微博的好友关系使用redis实现。
  8. 发布和订阅功能:可以用来做聊天软件。

redis和memcached的比较:

memcached redis
类型 纯内存数据库 内存磁盘同步数据库
数据类型 在定义value时就要固定数据类型 不需要
过期策略 支持 支持
虚拟内存 不支持 支持
存储数据安全 不支持 可以将数据同步到dump.db中
灾难恢复 不支持 可以将磁盘中的数据恢复到内存中
分布式 支持 主从同步
订阅与发布 不支持 支持

redis操作

1.字符串操作
  • 添加数据
         set key value
         如:
         set username xiaotuo
    
    将字符串值value关联到key。如果key已经持有其他值,set命令就会覆盖旧值,无视其类型。并且默认的过期时间是永久,即永远不会过期。
  • 删除:
       del key
       如:
       del username
    
  • 设置过期时间:
     expire key timeout(单位为秒)
    
    也可以在设置值的时候,一同指定过期时间:
      set key value EX timeout
      如:
      set age 18 EX 60 -->表示age为18这条数据会在60秒后过期
    
  • 查看过期时间:
      ttl key
      如:
      ttl age
    
  • 查看当前redis中的所有key:
        keys *
    
2.列表操作
  • 在列表左边添加元素:

     lpush key value ->在列表前插入  
    

    将值value插入到列表key的表头。如果key不存在,一个空列表会被创建并执行lpush操作。当key存在但不是列表类型时,将返回一个错误。

  • 在列表右边添加元素:

      rpush key value -> 在列表末尾插入
    

    将值value插入到列表key的末尾。如果key不存在,一个空列表会被创建并执行rpush操作。当key存在但不是列表类型时,将返回一个错误。

  • 查看列表中的元素:

     lrange key start stop ->start:起始位置:第一个是0,stop:结束位置:最后一个是-1
    
  • 移除列表中的元素:

    • 移除并返回列表key的头元素:

         lpop key ->这里的key是列表名
      
    • 移除并返回列表的尾元素:

        rpop key ->这里的key是列表名
      
    • 移除并返回列表key的中间元素:

        lrem key count value
      

      将移除key这个列表中,count个值为value的元素。

    • 指定返回第几个元素:

         lindex key index
      

      将返回key这个列表中,索引为index的这个元素。

    • 获取列表中的元素个数:

            llen key
            如:
           llen websites
      
    • 删除指定的元素:

         lrem key count value
         如:
         lrem websites 0 163.com
      

      根据参数count的值,移除列表中与参数value相等的元素。count的值可以是以下几种:

      • count>0:从表头开始向表尾搜索,移除与value相等的元素,数量为count
      • count<0:从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值。
      • count=0:移除表中所有与value相等的值。
3.集合的操作
  • 添加元素:

    sadd set value1 value2 ...
    如:
    sadd team xiaohong datuo
    
  • 查看元素:

    smembers set:
    如:
    smembers team
    
  • 移除元素:

       srem set member
       如:
       srem team xiaohong datuo
    
  • 查看集合中的元素个数:

    scard set
    如:
    scrad teaml
    
  • 获取多个集合的交集:

       sinter set1 set2
       如:
       sinter team1 team2
    
  • 获取多个集合的差集:

         sdiff set1 set2
         如:
          sdiff team1 team2
    
4.哈希操作 -->就像python中字典一样
  • 添加一个新值:

    hset key field value
    如:
    hset website baidu baidu.com
    

    将哈希表key中的域field的值设为value
    如果key不存在,一个新的哈希表被创建并执行HSET操作。如果域field已经存在于哈希表中,旧值将被覆盖。

  • 获取哈希中的field对应的值:

         hget key field
         如:
         hget website baidu
    
  • 删除field中的某个field:

      hdel key field
      如:
      hdel website baidu
    
  • 获取某个哈希中所有的fieldvalue:

     hgetall key
     如:
     hgetall website
    
  • 获取某个哈希中所有的field:

    hkeys key
    如:
    hkeys website
    
  • 获取某个哈希中所有的值:

         hvals key
         如:
         hvals website
    
  • 判断哈希中是否存在某个field

     hxists field
     如:
     hexists website baidu
    

你可能感兴趣的:(python)