Scrapy-Redis分布式爬虫组件
scrapy
是一个框架,它本身不支持分布式的。如果我们想要做分布式的爬虫,就需要借助一个组件叫做Scrapy - Redis
,这个组件正是利用了Redis
可以分布式的功能,集成到Scrapy
框架中,使得爬虫进行分布式。可以充分的利用资源(多个ip、更多带宽、同步爬取)来提高爬虫的爬行效率。
分布式爬虫的优点:
- 可以充分利用多台机器的带宽。
- 可以充分利用多台机器的ip地址。
- 多台机器做,爬取效率更高
分布式爬虫必须要解决的问题:
- 分布式爬虫是好几台机器在同时进行,如何保证不同的机器爬取页面的时候不会出现重复爬取的问题。
- 同样,分布式爬虫在不同的机器上进行,再把数据爬完后如何保证保存在同一个地方。
安装:
通过pip install scrapy-redis
即可安装。
redis教程
概述
redis
是一种支持分布式的·nosql
数据库,他的数据是保存在内存中,同时redis
可以定时把数据同步到磁盘,既可以将数据持久化,并且他比memcached
支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted[有序集合],hash(hash表))。
redis使用场景:
- 登录会话存储:存储在
redis
中,与memcached
相比,数据不会丢失。 - 排行版/计数器:比如一些秀场类的项目,经常会有一些前多少名主播排名。还有一些文章阅读量的技术,或者是新浪微博的点赞数等。
- 作为消息队列:比如
celery
就是使用redis
作为中间人。 - 当前在线人数:还是之前的秀场的例子,会显示当前系统有多少人在线。
- 一些常用的数据缓存:比如我们的
bbs
论坛,板块不会经常变化的。但是每次访问首页都是要从mysql
中获取,可以在redis
中缓存起来,不用每次请求数据库。 - 把前200篇文章缓存或者评论缓存:一般用户浏览网站,只会浏览前面一部分文章或者评论,那么可以把前面200篇文章和对应的评论缓存下来。用户访问超过的,就访问数据库,并且以后文章超过200篇,则把之前的文章删除。
- 好友关系:微博的好友关系使用
redis
实现。 - 发布和订阅功能:可以用来做聊天软件。
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
相等的值。
- count>0:从表头开始向表尾搜索,移除与
-
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
-
获取某个哈希中所有的
field
和value
:hgetall key 如: hgetall website
-
获取某个哈希中所有的
field
:hkeys key 如: hkeys website
-
获取某个哈希中所有的值:
hvals key 如: hvals website
-
判断哈希中是否存在某个
field
:hxists field 如: hexists website baidu