爬虫---Scrapy_redis

一:scrapyredis介绍

        1.1Scrapy_redis的基础概念

                为什么要学习Scrapy_redis:Scrapy_redis在scrapy的基础上实现了更多,更强大的功能,具体体现在:request去重,爬虫持久化和轻松实现分布式

        1.2Scrapy_redis的流程

                

二:redis复习

        2.1复习redis的使用:

                redis是什么:Redis是一个开源,内存数据库,它可以用作数据库,缓存和消息中间件。它支持多种类型的数据结构,比如字符串,哈希,列表,集合,有序集合等

                常用命令:

                        /etc/init.d/redis-server stop  ---redis停止

                        /etc/init.d/redis-server start  ---redis启动

                        /etc/init.d/redis-server restart  ---redis重启

                        redis -cli -h <hostname> -p <port> --->远程连接redis数据库

                redis中:

                        0, select 1   ---->切换到db1,默认在db0

                        1, keys *   ---->查看所有的redis键

                        2, type "键"   ---->查看键的数据类型

                        3, flushdb   ---->清空当前db

                        4, flushall   ---->清空所有db

                列表:

                        LPUSH mylist "world"  ---->向mylist从左边添加一个值

                        LRANGE mylist 0 -1  ---->返回mylist中的所有的值

                       LLEN mylist ---->返回mylist的长度

                set:

                        redis>  SADD myset "hello"--->往set中添加数据

                        redis>  SMEMBERS myset --->获取myset中所有的元素

                        redis>  SCARD myset--->scrad获取数量

                zset:

                        redis>  ZADD myzset 1 "one"

                        (integer) 1

                        redis>  ZADD myzset 2 "two" 3 "three"

                        (integer) 2

                        redis> ZRANGE myzset 0 -1 WITHSCORES

                        1) "one"

                        2) "1"

                        3) "two"

                        4) "2"

                        5) "three"

                        6) "3"

                        redis>  ZCARD myzset

                        zadd向一个zset中添加一个值和分数,如果存在值,就更新分数,分数可以相同

                        zrange遍历myzeset

                        zcard返回zset中元素的数量

三:domz程序介绍

        执行domz的爬虫,会发现redis中多出三个键:1)"dmoz:requests"  2)"dmoz:dupefilter"  3)"dmoz:items"

        1)代表的是Scheduler队列,存放的待请求的request对象,获取的过程是pop操作,即获取一个会去除一个

        2)指纹集合,存放的是已经进入scheduler队列的requests对象的指纹,指纹默认由请求方法,url和请求体组成

        3)存放的获取到的item信息,在pipeline中开启redispipeline才会存入

WU四:scrapy_redis的源码介绍

        4.1scrapy_redis去重方法:使用sha1加密request得到指纹;把指纹存放到redis的集合中;下一次新来一个request,同样的方式生成指纹,判断指纹是否存在redis的集合中

               生成指纹: fp=hashlib.sha1()

                                 fp.update(to_bytes(request.metd))

                                 fp.update(to_bytes(canonicalize_url(request.url)))

                                 fp.update(request.body or b'')

                                 return fp.hexdigest()

              判断数据是否存在redis的集合中,不存在插入

                        added =self.server.sadd(self.key,fp)

                        return added !=0

        4.2request对象什么时候入队

                dont_filter = True ,构造请求体的时候,把dont_filter置为True,该url会被反复抓取(url地址对应的内容会更新的情况)

                一个全新的url地址被抓到的时候,构造request请求

                url地址在start_urls中的时候,会入队,不管之前是否请求过  (构造start_url地址的请求时候,dont_filter=True)

                def enqueue_request(self,request):

                    if not request.dont_filter and

                    self.df.request_seen(request):

                            self.df.log(request,self.spider)

                            return False

                   self.queue.push(request)

                   return Ture

      五:总结:

                domz相比于之前的spider多了持久化和request去重功能

                在之后的爬虫中,我们可以模仿domz的用法,使scrapy_redis实现相同的功能

                注意:setting中的配置都是可以自己设定的,意味着我们的可以重写去重和调度器的方法,包括是否要把数据储存到redis(pipeline)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值