为什么nosql
在一个更加普遍通用的爬虫程序中,原始数据往往是杂乱且没有规律的,将这些数据存储在关系型数据库中的成本很高,定义schema就是一个非常繁琐复杂的工作,而且爬虫数据一般没有OLTP的需求,这时候使用nosql也许是更好的选择。
为什么MongoDB
- MongoDB的提供了一个面向文档存储(类似于 JSON 对象,但比JSON支持更多数据类型),适用于整个对象存储,操作起来比较简单和容易。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档,适用于覆盖历史数据的操作。
- 支持索引,有大量数据是保证了查询速度。
MongoDB使用
可以使用docker简单的启动一个没有用户认证的mongo实例
docker run -itd --name mongo -p 27017:27017 mongo
写入数据,在uper集合中插入一条文档,集合不存在会自动创建。
> db.uper.insert({nick: 'C酱です',
uid:67141,
description: '一名普通玩家(:3rz) 直播间:live.bilibili.com/213',
tags: ['游戏', '单机游戏'],
fans: 6400000
})
查询
# 查询uper中所有的文档
> db.uper.find().pretty()
{
"_id" : ObjectId("5fb1224b8f09d0de911ee41e"),
"nick" : "C酱です",
"uid" : 67141,
"description" : "一名普通玩家(:3rz) 直播间:live.bilibili.com/213",
"tags" : [
"游戏",
"单机游戏"
],
"fans" : 6400000
}
{
"_id" : ObjectId("5fb1238d8f09d0de911ee41f"),
"nick" : "影视飓风",
"uid" : 946974,
"description" : "商务合作/广告/宣传片/影视摄制私信",
"tags" : [
"影视"
],
"fans" : 1785000
}
{
"_id" : ObjectId("5fb123cd8f09d0de911ee420"),
"nick" : "黑桐谷歌",
"uid" : 43536,
"description" : "一个普通喜欢玩游戏的人",
"tags" : [
"游戏",
"单机游戏"
],
"fans" : 2260000
}
{
"_id" : ObjectId("5fb1245b8f09d0de911ee421"),
"nick" : "风铃秋石",
"uid" : 7722619,
"description" : "配了音的攻略视频都推荐1.25倍速播放,LOL新手向攻略UP主。大部分攻略有很多分P可挑选观看,声音天生,不喜勿喷!",
"tags" : [
"游戏",
"网络游戏",
"英雄联盟"
],
"fans" : 56000
}
# 查询tag带有"游戏"的文档
> db.uper.find( { tags:'游戏' }).pretty()
{
"_id" : ObjectId("5fb1224b8f09d0de911ee41e"),
"nick" : "C酱です",
"uid" : 67141,
"description" : "一名普通玩家(:3rz) 直播间:live.bilibili.com/213",
"tags" : [
"游戏",
"单机游戏"
],
"fans" : 6400000
}
{
"_id" : ObjectId("5fb123cd8f09d0de911ee420"),
"nick" : "黑桐谷歌",
"uid" : 43536,
"description" : "一个普通喜欢玩游戏的人",
"tags" : [
"游戏",
"单机游戏"
],
"fans" : 2260000
}
{
"_id" : ObjectId("5fb1245b8f09d0de911ee421"),
"nick" : "风铃秋石",
"uid" : 7722619,
"description" : "配了音的攻略视频都推荐1.25倍速播放,LOL新手向攻略UP主。大部分攻略有很多分P可挑选观看,声音天生,不喜勿喷!",
"tags" : [
"游戏",
"网络游戏",
"英雄联盟"
],
"fans" : 56000
}
# 查询tag带有"游戏" 并且粉丝大于500万的
> db.uper.find(
{
tags:'游戏',
fans:{"$gte" : 5000000}
}).pretty()
{
"_id" : ObjectId("5fb1224b8f09d0de911ee41e"),
"nick" : "C酱です",
"uid" : 67141,
"description" : "一名普通玩家(:3rz) 直播间:live.bilibili.com/213",
"tags" : [
"游戏",
"单机游戏"
],
"fans" : 6400000
}
当数据发生变化时 更新覆盖旧数据
# 更新uid67141的uper的粉丝数
> db.uper.update({'uid':67141},{$set:{'fans':6600000}})
# 更新后的数据
> db.uper.find({uid:67141}).pretty()
{
"_id" : ObjectId("5fb1224b8f09d0de911ee41e"),
"nick" : "C酱です",
"uid" : 67141,
"description" : "一名普通玩家(:3rz) 直播间:live.bilibili.com/213",
"tags" : [
"游戏",
"单机游戏"
],
"fans" : 6600000
}