【原创】Python网络爬虫

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

2020-04-14  本文已影响0人  复苏的兵马俑

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"})
上一篇下一篇

猜你喜欢

热点阅读