Python爬虫-数据存储学习笔记之MongoDB操作

1、MongoDB描述

   MongoDB是一个基于分布式文件存储的NoSQL数据库,在处理海量数据的时候会比MySQL更有优势,爬虫如果上了一个量级,可能就会比较推荐使用MongoDB,当然没有上量的数据也完全可以使用MongoDB来存储数据,因此学会MongoDB也是爬虫工程师必须掌握的一个技能。
   MongoDB官方文档:http://www.mongoing.com/docs/

1)文档

   A)MongoDB是一个面向文档的数据库;
   B)举例:{“foo”:3, “greeting”:“Hello,world!”};
   C)区分大小写,且key唯一,不可重复,文档可嵌套。

2)集合

   集合就是一组文档,文档类似于关系型数据库里的行,集合类似于关系型数据库里的表,集合中的文档无需固定额结构(与关系型数据库的区别)。

3)集合的命名

   A)不能有空字符串(" ");
   B)不能包含\0字符(空字符);
   C)不能使用system.的前缀(系统保留);
   D)建议不包含保留字 "$";
   E)用 . 分割不懂命名空间的子集合(如:blog.users, blog.posts)。

4)数据库

   A)多个文档组成集合,多个集合组成数据库;
   B)一个实例可以承载多个数据库;
   C)每个数据库都有独立的权限;
   D)保留的数据名称(admin,local,config)。

2、安装MongoDB

   从官网下载mis安装包,安装在根目录下MongoDB文件夹里就OK,例如:D:\MongoDB\Server\4.2

3、启动MongoDB

   A)创建数据目录:在启动MongoDB之前,首先要给MongoDB指定一个数据存储的路径,比如在MongoDB的安装路径下创建一个data文件夹,专门用来存储数据:D:\MongoDB\Server\4.2\data
   B)添加环境变量:将MongoDB的bin目录添加到环境变量中,方便后期调用;
   C)启动MongoDB:执行命令mongod --dbpath D:\MongoDB\Server\4.2\data启动。

4、连接MongoDB

   A)使用CMD连接:在环境变量设置好的前提下,使用命令mongo就可以进入到MongoDB的操作终端了。
   B)使用Compass连接:Compass是一个图形化操作MongoDB的客户端,使用Compass操作MongoDB会更加方便。
   B)使用Navicat连接:Navicat是一个可以操作MySQL数据库非常方便的软件,使用Navicat操作数据库,就跟使用Excel操作数据是一样的。

5、将MongoDB制作成Windows服务

   启动MongoDB后,如果想让MongoDB一直运行,那么这个终端便不能关闭,而且每次运行的时候还需要指定data目录,为了便于以后使用,可以将MongoDB制作成一个服务,以后通过一行命令就可以运行了。

   A)创建配置文件:在MongoDB的安装路径下创建配置文件mongod.cfg(路径和名字可自行设置),然后在配置文件中添加如下代码:

logpath = D:\MongoDB\Server\4.2\data\logs\mongod.log
dbpath = D:\MongoDB\Server\4.2\data\db

   说明:logpath是日志文件的路径,dbpath是MongoDB数据库的存储路径。

   B)安装MongoDB服务:使用命令mongod --config "cfg配置文件所在路径" --install,比如mongod --config "D:\MongoDB\Server\4.2\mongod.cfg" --install
   C)启动MongoDB服务:net start mongodb
   D)关闭MongoDB服务:net stop mongodb
   E)移除MongoDB服务:"D:\MongoDB\Server\4.2\bin\mongod.exe" --remove

7、MongoDB介绍

SQL术语/概念 MongoDB术语/概念 解释/说明
database database SQL:数据库
MongoDB:数据库
table collection SQL:数据库表
MongoDB:集合
row document SQL:数据记录行
MongoDB:文档
column field SQL:数据字段
MongoDB:域
index index SQL:索引
MongoDB:索引
table joins SQL:表连接
MongoDB:不支持
primary key primary key SQL: 主键
MongoDB:主键,自动将_id字段设置为主键
1)MongoDB三元素

   A)数据库
   B)集合(collection):就是关系型数据库中的表,可以存储多个文档,结构可以不固定,可以存储如下文档在一个集合中:

  {"name": "aaa", "gender": "1"}
  {"name": "bbb", "age": 18}
  {"title": "ccc", "price": 20.9}

   C)文档(document):就是关系型数据库中的一行,文档是一个对象,由键值对构成,是json的扩展形式:{'name': 'aaa', 'gender': '1'}

2)MongoDB操作命令

   A)db:查看当前的数据库;
   B)show dbs:查看所有的数据库;
   C)use 数据库名:切换数据库,如果数据库不存在,则创建一个(创建完成后需要插入数据库才算创建成功);
   D)db.dropDatabase():删除当前指向的数据库;
   E)db.集合名.insert(value):添加数据到指定的集合中;
   F)db.集合名.find():从指定的结合中查找数据。
   注:更多命令请见http://www.runoob.com/mongodb/mongodb-tutorial.html

8、使用Python操作MongoDB

   1)操作MongoDB需要使用的中间件:pymongo。
   2)连接MongoDB并写入数据。

import pymongo

# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)

# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu

# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa

# 写入数据
collection.insert_one({"name": "Kevin", "age": 20, "job": "PM"})

   MongoDB的数据类型:

类型 说明
Object ID 文档ID
String 字符串,最常用,必须是有效的UTF-8
Boolean 存储一个布尔值,true或false
Integer 整数可以是32位或64位,这取决于服务器
Double 存储浮点值
Arrays 数组或列表,多个值存储到一个键
Object 用于嵌入式的文档,即一个值为一个文档
Null 存储Null值
Timestamp 时间戳,表示从1970-01-01到现在的总秒数
Date 存储当前日期或时间的UNIX时间格式

   3)新增数据(Insert)
   A)新增一条数据insert_one/insert,示例代码如下:

import pymongo

# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)

# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu

# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa

# 新增数据
person = {
    "name": 'Jhon',
    "age": 21,
    "job": "IT"
}
# 插入数据到数据库
collection.insert_one(person)

   B)新增多条数据insert_many,示例代码如下:

import pymongo

# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)

# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu

# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa

# 新增数据
person = [{
    "name": 'Jacky',
    "age": 21,
    "job": "IT"
},
{
    "name": 'Jose',
    "age": 24,
    "job": "HR"
}]
# 插入数据到数据库
collection.insert_many(person)

   4)查询数据(Find)
   A)查询集合中所有数据find,示例代码如下:

import pymongo

# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)

# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu

# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa

cursor = collection.find()
for data in cursor:
    print(data)

   运行结果:

{'_id': ObjectId('5e951d2d8841ab7f4f0dece0'), 'name': 'Kevin', 'age': 20, 'job': 'PM'}
{'_id': ObjectId('5e9533e97872f736c34c6ddb'), 'name': 'Jhon', 'age': 21, 'job': 'IT'}
{'_id': ObjectId('5e9534b8d1981fd527e13f83'), 'name': 'Jacky', 'age': 21, 'job': 'IT'}
{'_id': ObjectId('5e9534b8d1981fd527e13f84'), 'name': 'Jose', 'age': 24, 'job': 'HR'}

   B)查询集合中的一条数据find_one,示例代码如下:

import pymongo

# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)

# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu

# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa

data = collection.find_one({"age" : 20})
print(data)

   运行结果:

{'_id': ObjectId('5e951d2d8841ab7f4f0dece0'), 'name': 'Kevin', 'age': 20, 'job': 'PM'}

   5)更新数据(Update)
   A)更新一条数据update_one,示例代码如下:

import pymongo

# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)

# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu

# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa

collection.update_one({"name": "Kevin"}, {"$set":{"name": "Kely"}})

   B)更新多条数据update_many,示例代码如下:

import pymongo

# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)

# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu

# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa

collection.update_many({"name": "Kely"}, {"$set":{"name": "Kevin"}})

   6)删除数据(Delete)
   A)删除一条数据delete_one,示例代码如下:

import pymongo

# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)

# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu

# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa

collection.delete_one({"name": "Jacky"})

   B)删除多条数据delete_many,示例代码如下:

import pymongo

# 获取连接MongoDB的对象
conn = pymongo.MongoClient("127.0.0.1", port = 27017)

# 获取数据库(如果没有zhihu这个数据库,会自动创建)
db = conn.zhihu

# 获取数据库中的集合(也就是MySQL中的表)
collection = db.qa

collection.delete_many({"name": "Kevin"})
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容

  • 一、MongoDB简介 1.概述 ​ MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WE...
    郑元吉阅读 974评论 0 2
  • NoSql数据库优缺点 在优势方面主要体现在下面几点: 简单的扩展 快速的读写 低廉的成本 灵活的数据模型 在不足...
    dreamer_lk阅读 2,705评论 0 6
  • 一、MongoDB简介 概述MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供...
    王梓懿_1fbc阅读 488评论 0 3
  • 一、MongoDB简介 概述MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供...
    EndEvent阅读 1,159评论 1 4
  • 一、MongoDB简介 概述MongoDB是一个基于分布式文件存储的数据库,由C++语言编写。旨在为WEB应用提供...
    慕杨_阅读 550评论 0 4