爬虫与Python:(四)爬虫进阶二之数据存储(数据库存储)——7.Redis存储
Redis是一个开源的使用ANSI C语言编写、遵从BSD协议、支持网络,以及可基于内存也可持久化日志、Key-Value数据库、并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是字符串(string)、哈希(Hash)、列表(list)、集合(set)和有序集合(sorted set)等类型。
在Python爬虫系统中,经常会使用Redis数据库进行URL去重。
在爬虫中应用Redis最多的是Redis的列表(list)和集合(set),所以下面主要以两个为例进行讲解。
安装Redis库
关于Redis数据库的安装,这里省略。要在Python中操作Redis,需要安装redis库。可以使用pip命令来安装,代码如下:
pip3 install redis
安装好之后,新建一个test_redis.py文件并输入以下代码,运行后如果没有报错,则表示已安装成功。
import redis
1.列表
Redis列表是简单的字符串列表,安装插入顺序排序。用户可以添加一个元素到列表的头部(左侧)或尾部(右侧),一个列最多包含232-1个元素(4294967295,每个列超过40亿个元素)。下面示例中,使用了Ipushu方法将3个值插入名为test_list的列表中。
1 import redis 2 3 # redis插入列表 4 conn = redis.StrictRedis(host='127.0.0.1',port=6379) 5 6 conn.lpush("test_list",1) 7 conn.lpush("test_list",2) 8 conn.lpush("test_list",3)
与列表相关的基本命令如下表所示。
序号 | 命令 | 描述 |
1 | BLPOP key [key2] timeout | 移出并获取列的第一个元素,如果列表没有元素,就会阻塞列表直到等待超时或发现可弹出元素为止。 |
2 | BRPOP key [key2] timeout | 移出并获取列表的最后一个元素,如果列表没有元素就会阻塞列表直到等待超时或发现可弹出元素为止。 |
3 | BRPOPLPUSH source desination timeout | 从列表中弹出一个值,将弹出的元素插入另一个列表中并返回;如果列表没有元素,就会阻塞列表直到等待超时或发现可弹出元素为止。 |
4 | LINDEX key index | 通过索引获取列表中的元素 |
5 | LINSERT key BEFORE|AFTER pivot value | 在列表的元素前后插入元素 |
6 | LLEN key | 获取列表长度 |
7 | LPOP key | 移出并获取列表的第一个元素 |
8 | LPUSH key value1 [value2] | 将一个或多个值插入列表头部 |
9 | LPUSHX key value | 将一个值插入已存在的列表头部 |
10 | LRANGE key start stop | 获取列表指定范围内的元素 |
11 | LREM key count value | 移除列表元素 |
12 | LSET key index value | 通过索引设置列表元素值 |
13 | LTRIM key start stop | 对一个列表进行修剪,即让列表只保留指定区间内的元素,不在指定区间内的元素将被删除 |
14 | RPOP key | 移除列表的最后一个元素,返回值为移除的元素 |
15 | RPOPLPUSHsourcedestination | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
16 | RPUSH key value1 [value2] | 在列表中添加一个或多个值 |
17 | RPUSHX key value | 为已存在的列表添加值 |
2. 集合
Redis里的set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis中的集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)。集合中最大的成员数为232-1。下面的实力中,sadd方法将值插入名为test_list1的列表中。
1 import redis 2 3 conn = redis.StrictRedis(host='127.0.0.1',port=6379) 4 5 conn.sadd("test_list1",1) 6 conn.sadd("test_list1",2) 7 conn.sadd("test_list1",3)
下表列出了Redis集合的基本命令。
序号 | 命令 | 描述 |
1 | SADD key member1 [member2] | 向集合添加一个或多个成员 |
2 | SCARD key | 获取集合的成员数 |
3 | SDIFF key [key2] | 返回给定所有集合的差集 |
4 | SDIFFSTORE destination key [key2] | 返回给定所有集合的差集并存储在destination中 |
5 | SINTER key1 [key2] | 返回给定所有集合的交集 |
6 | SINTERdestination key [key2] | 返回给定所有集合的交集并存储在destination中 |
7 | SISMEMBER key member | 判断member元素是否是集合key的成员 |
8 | SMEMBERS key | 返回集合中所有成员 |
9 | SMOVE source destination member | 将member元素从source集合移动到destination集合 |
10 | SPOP key | 移除并返回集合中的一个随机元素 |
11 | SRANDMEMBER key [count] | 返回集合中的一个或多个随机数 |
12 | SREM key member1 [member2] | 移除集合中的一个或多个成员 |
13 | SUNION key1 [key2] | 返回所有给定的并集 |
14 | SUNIONSTORE destination key1 [key2] | 所有给定集合的并集存储在destination集合中 |
15 | SSAN key cursor [MATCH pattern] [COUNT count] | 迭代集合中的元素 |
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。