12.4 Redis
Redis是一个使用ANSI C编写的高性能Key-Value数据库,使用内存作为主存储,内存中的数据也可以被持久化到硬盘。
在Python中可以使用第三方库redis-py访问Redis数据库,使用pip安装redis-py:
$ sudo pip install redis
下面是使用redis-py将数据写入Redis数据库的简单示例:
import redis # 连接数据库 r = redis.StrictRedis(host='localhost', port=6379, db=0) # 创建3 条数据 person1 = { 'name': '刘硕', 'age': 34, 'sex': 'M', } person2= { 'name': '李雷', 'age': 32, 'sex': 'M', } person3= { 'name': '韩梅梅', 'age': 31, 'sex': 'F', } # 将3 条数据以Hash 类型(哈希)保存到Redis中 r.hmset('person:1', person1) r.hmset('person:2', person2) r.hmset('person:3', person3) # 关闭连接 r.connection_pool.disconnect()
Redis是Key-Value数据库,一项数据在数据库中就是一个键值对,存储多项同类别的数据时(如Book),通常以item:id这样的形式作为每项数据的键,其中的“:”并没有什么特殊,也可以换成“-”或“/”等,只是大家习惯这样使用。
仿照SQLitePipeline实现RedisPipeline,代码如下:
import redis from scrapy import Item class RedisPipeline: def open_spider(self, spider): db_host = spider.settings.get('REDIS_HOST', 'localhost') db_port = spider.settings.get('REDIS_PORT', 6379) db_index = spider.settings.get('REDIS_DB_INDEX', 0) self.db_conn = redis.StrictRedis(host=db_host, port=db_port, db=db_index) self.item_i = 0 def close_spider(self, spider): self.db_conn.connection_pool.disconnect() def process_item(self, item, spider): self.insert_db(item) return item def insert_db(self, item): if isinstance(item, Item): item = dict(item) self.item_i += 1 self.db_conn.hmset('book:%s' % self.item_i, item)
解释上述代码如下:
open_spider方法在开始爬取数据之前被调用,在该方法中通过spider.settings对象读取用户在配置文件中指定的数据库,然后建立与数据库的连接,将得到的连接对象赋值给self.db_conn,以便之后使用,并初始化一个self.item_i作为每项数据的id。在插入一项数据时,使用self.item_i自加的结果构造数据在数据库中的键。
process_item方法处理爬取到的每一项数据,在该方法中调用insert_db方法执行数据库的插入操作,在insert_db方法中先将一项数据转换成字典,然后调用hmset方法将数据以Hash类型存入Redis数据库。
close_spider方法在爬取完全部数据后被调用,在该方法中关闭与数据库的连接。
在配置文件settings.py中指定我们所要使用的Redis数据库,并启用RedisPipeline:
REDIS_HOST = 'localhost' REDIS_PORT = 6379 REDIS_DB_INDEX = 0 ITEM_PIPELINES = { 'toscrape_book.pipelines.RedisPipeline': 404, }
运行爬虫,并查看数据库:
$ scrapy crawl books $ redis-cli 127.0.0.1:6379> KEYS book:* 1) "book:470" 2) "book:300" 3) "book:801" 4) "book:476" 5) "book:914" ...省略中间输出... 995) "book:703" 996) "book:407" 997) "book:995" 998) "book:569" 999) "book:298" 1000) "book:110" 127.0.0.1:6379> HGETALL book:1 1) "price" 2) "\xc2\xa351.33" 3) "review_rating" 4) "2" 5) "review_num" 6) "0" 7) "name" 8) "Libertarianism for Beginners" 9) "stock" 10) "19" 11) "upc" 12) "a18a4f574854aced" 127.0.0.1:6379> HGETALL book:2 1) "price" 2) "\xc2\xa317.46" 3) "review_rating" 4) "5" 5) "review_num" 6) "0" 7) "name" 8) "Set Me Free" 9) "stock" 10) "19" 11) "upc" 12) "ce6396b0f23f6ecc"
结果表明,我们成功地将1000条数据存储到了Redis数据库。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论