一: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)