Python3 爬虫学习笔记 C11【数据储存系列 — MongoDB】


Python3 爬虫学习笔记第十一章 —— 【数据储存系列 — MongoDB】

文章目录

  • 【11.1】关于 MongoDB
  • 【11.2】MongoDB 基本操作语句
  • 【11.3】连接 MongoDB
  • 【11.4】指定数据库
  • 【11.5】指定集合
  • 【11.6】插入数据
  • 【11.6】数据查询
  • 【11.7】数据计数
  • 【11.8】数据排序
  • 【11.9】数据偏移
  • 【11.10】更新数据
  • 【11.11】删除数据


【11.1】关于 MongoDB

MongoDB 属于非关系型数据库,即 NoSQL(Not Only SQL),NoSQL 是基于键值对的,不需要经过 SQL 层的解析,数据之间没有耦合性,性能极高,非关系型数据库分为以下几种:

  • 键值存储数据库:Redis、Voldemort、Oracle BDB 等;
  • 列存储数据库:Cassandra、HBase、Riak 等;
  • 文档型数据库:CouchDB、MongoDB 等;
  • 图形数据库:Neo4J、InfoGrid、Infinite Graph 等。

【11.2】MongoDB 基本操作语句

# 创建数据库(如果数据库不存在就创建数据库, 存在就切换到指定的数据库)
use DATABASE_NAME# 查看所有数据库
show dbs# 查看当前所在数据库
db# 删除当前数据库
db.dropDatabase()# 删除集合
db.COLLECTION_NAME.drop()# 创建集合
db.createCollection("COLLECTION_NAME")# 插入文档
db.COLLECTION_NAME.insert(document)
db.COLLECTION_NAME.save(document) # 更新文档
db.COLLECTION_NAME.update()# 删除文档
db.COLLECTION_NAME.remove()# 查询文档
db.COLLECTION_NAME.find(query, projection)

【11.3】连接 MongoDB

连接 MongoDB 需要导入 pymongo 库,使用 MongoClient() 方法,向其传入地址参数 host 和 端口参数 port 即可

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)

也可以直接传入 MongoDB 的连接字符串:

import pymongoclient = pymongo.MongoClient('mongodb://localhost:27017/')

【11.4】指定数据库

使用以下语句皆可指定一个名为 spiders 的数据库:

db = client.spiders
db = client['spiders']

【11.5】指定集合

MongoDB 的每个数据库包含多个集合(collection),类似于关系型数据库 MySQL 中的数据表,使用以下语句皆可指定一个名为 students 的集合:

collection = db.students
collection = db['students']

【11.6】插入数据

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
students = {'id': '17110105','name': 'TRHX','age': 20,'gender': 'male'
}
result = collection.insert(students)
print(result)

在 spiders 数据库的 students 集合里,新建一条学生数据,该数据以字典形式表示,调用 collection 的 insert() 方法插入数据,在 MongoDB 中,每条数据都有一个_id 属性来唯一标识。如果没有显式指明该属性,MongoDB 会自动产生一个 ObjectId 类型的_id 属性。insert() 方法会在执行后返回 _id 值,在 MongoDB 数据库里面可以看到已经成功插入数据,输出结果:

5d6f1a4b57b65e1547bb3c24

01

进阶操作:同时插入多条数据,以列表形式传递:

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
students1 = {'id': '17110105','name': 'TRHX','age': 20,'gender': 'male'
}
students2 = {'id': '17110106','name': 'AAAA','age': 22,'gender': 'male'
}
result = collection.insert([students1, students2])
print(result)

输出结果:

[ObjectId('5d6f2be3cd1721962218a709'), ObjectId('5d6f2be3cd1721962218a70a')]

02

PyMongo 3.x 及以上版本中,推荐使用 insert_one()insert_many() 方法来分别插入单条记录和多条记录,示例:

插入单条记录

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
students = {'id': '17110105','name': 'TRHX','age': 20,'gender': 'male'
}
result = collection.insert_one(students)
print(result)
print(result.inserted_id)

返回的是 InsertOneResult 对象,调用其 inserted_id 属性获取_id:

<pymongo.results.InsertOneResult object at 0x0000020ED91A5608>
5d6f73940fe700c5a7ac19f0

插入多条记录

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
students1 = {'id': '17110105','name': 'TRHX','age': 20,'gender': 'male'
}
students2 = {'id': '17110106','name': 'AAAA','age': 22,'gender': 'male'
}
result = collection.insert_many([students1, students2])
print(result)
print(result.inserted_ids)

返回的类型是 InsertManyResult,调用 inserted_ids 属性可以获取插入数据的_id 列表:

<pymongo.results.InsertManyResult object at 0x0000021698DD36C8>
[ObjectId('5d6f68598fa881c69b2e0006'), ObjectId('5d6f68598fa881c69b2e0007')]

【11.6】数据查询

事先已经创建好 spiders 数据库和 students 集合,包含以下数据:

_id:ObjectId("5d6f95d40828142f1dc35fa5")
id:"17110105"
name:"TRHX"
age:20
gender:"male"_id:ObjectId("5d6f95d40828142f1dc35fa6")
id:"17110106"
name:"AAA"
age:20
gender:"male"_id:ObjectId("5d6f95d40828142f1dc35fa7")
id:"17110107"
name:"BBB"
age:19
gender:"female"_id:ObjectId("5d6f95d40828142f1dc35fa8")
id:"17110108"
name:"CCC"
age:22
gender:"male"

查询方法一:利用 find_one()find() 方法进行查询, find_one() 查询得到的是单个结果,find() 则返回一个生成器对象

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
result = collection.find_one({'name': 'TRHX'})
print(result)

查询 name 为 TRHX 的数据,返回一个字典类型:

{'_id': ObjectId('5d6f95d40828142f1dc35fa5'), 'id': '17110105', 'name': 'TRHX', 'age': 20, 'gender': 'male'}

查询方法二:根据 ObjectId 查询,查询时需要使用 bson 库里面的 objectid:

import pymongo
from bson.objectid import ObjectIdclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
result = collection.find_one({'_id': ObjectId('5d6f95d40828142f1dc35fa7')})
print(result)

查询结果:

{'_id': ObjectId('5d6f95d40828142f1dc35fa7'), 'id': '17110107', 'name': 'BBB', 'age': 19, 'gender': 'female'}

使用 find() 方法查询多条数据:

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
results = collection.find({'gender': 'male'})
print(results)
for result in results:print(result)

find() 方法返回一个生成器对象,遍历得到所有数据,每条数据都是字典类型:

<pymongo.cursor.Cursor object at 0x00000191F69AAA90>
{'_id': ObjectId('5d6f95d40828142f1dc35fa5'), 'id': '17110105', 'name': 'TRHX', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('5d6f95d40828142f1dc35fa6'), 'id': '17110106', 'name': 'AAA', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('5d6f95d40828142f1dc35fa8'), 'id': '17110108', 'name': 'CCC', 'age': 22, 'gender': 'male'}

在查询条件中加入比较符号进行查询,以下代码实现了年龄大于等于20的数据查询:

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
results = collection.find({'age': {'$gte': 20}})
for result in results:print(result)

符号 $gte 表示大于等于,查询结果如下:

{'_id': ObjectId('5d6f95d40828142f1dc35fa5'), 'id': '17110105', 'name': 'TRHX', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('5d6f95d40828142f1dc35fa6'), 'id': '17110106', 'name': 'AAA', 'age': 20, 'gender': 'male'}
{'_id': ObjectId('5d6f95d40828142f1dc35fa8'), 'id': '17110108', 'name': 'CCC', 'age': 22, 'gender': 'male'}
附表:各种比较符号
符号含义示例
$lt小于{‘age’: {’$lt’: 20}}
$gt大于{‘age’: {’$gt’: 20}}
$lte小于等于{‘age’: {’$lte’: 20}}
$gte大于等于{‘age’: {’$gte’: 20}}
$ne不等于{‘age’: {’$ne’: 20}}
$in在范围内{‘age’: {’$in’: [20, 23]}}
$nin不在范围内{‘age’: {’$nin’: [20, 23]}}

在查询条件中加入功能符号进行查询,以下代码用正则匹配实现了对名字以 T 开头的学生数据的查询:

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
results = collection.find({'name': {'$regex': '^T.*'}})
for result in results:print(result)

查询结果:

{'_id': ObjectId('5d6f95d40828142f1dc35fa5'), 'id': '17110105', 'name': 'TRHX', 'age': 20, 'gender': 'male'}
附表:各种功能符号
符号含义示例示例含义
$regex匹配正则表达式{‘name’: {’$regex’: ‘^T.*’}}name 以 T 开头
$exists属性是否存在{‘name’: {’$exists’: True}}name 属性存在
$type类型判断{‘age’: {’$type’: ‘int’}}age 的类型为 int
$mod数字模操作{‘age’: {’$mod’: [5, 0]}}年龄模 5 余 0
$text文本查询{‘KaTeX parse error: Expected '}', got 'EOF' at end of input: text': {'search’: ‘Mike’}}text 类型的属性中包含 Mike 字符串
$where高级条件查询{’$where’: ‘obj.fans_count == obj.follows_count’}自身粉丝数等于关注数

其他操作:https://docs.mongodb.com/manual/reference/operator/query/

【11.7】数据计数

调用 count() 方法可以统计查询结果有多少条数据,输出结果为一个整数:

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
result = collection.find({'name': {'$regex': '^T.*'}}).count()
print(result)

【11.8】数据排序

调用 sort() 方法,向其传入排序的字段及升降序标志即可完成排序:

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
ascending = collection.find().sort('name', pymongo.ASCENDING)
descending = collection.find().sort('name', pymongo.DESCENDING)
print('升序排列:', [result['name'] for result in ascending])
print('降序排列:', [result['name'] for result in descending])

输出结果:

升序排列: ['AAA', 'BBB', 'CCC', 'TRHX']
降序排列: ['TRHX', 'CCC', 'BBB', 'AAA']

【11.9】数据偏移

利用 skip() 方法偏移几个位置,就可以跳过前几条数据,获取偏移量之后的几个数据;利用 limit() 方法指定获取前几条数据:

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
ascending = collection.find().sort('name', pymongo.ASCENDING).skip(1)
descending = collection.find().sort('name', pymongo.DESCENDING).limit(2)
print('升序排列(偏移量为1,获取后三条数据):', [result['name'] for result in ascending])
print('降序排列(限制获取前两条数据):', [result['name'] for result in descending])

输出结果:

升序排列(偏移量为1,获取后三条数据): ['BBB', 'CCC', 'TRHX']
降序排列(限制获取前两条数据): ['TRHX', 'CCC']

【11.10】更新数据

使用 update() 方法,指定更新的条件和更新后的数据即可:

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
condition = {'name': 'TRHX'}
student = collection.find_one(condition)
student['age'] = 18
result = collection.update(condition, student)
print(result)

该代码将 name 为 TRHX 的 age 改为了 18,返回结果仍然是字典形式,ok 代表执行成功,nModified 代表影响的数据条数:

{'n': 1, 'nModified': 1, 'ok': 1.0, 'updatedExisting': True}

进阶操作:使用 $set 操作符对数据进行更新,指定更新的条件和更新后的数据即可,这样做的好处是:只更新指定的 student 字典内存在的字段,如果原先还有其他字段,则不会更新,也不会删除;如果不用 $set ,则会把之前的数据全部用 student 字典替换,如果原本存在其他字段,则会被删除

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
condition = {'name': 'TRHX'}
student = collection.find_one(condition)
student['age'] = 18
result = collection.update(condition, {'$set': student})
print(result)

和插入数据的 insert() 方法一样,在 PyMongo 3.x 版本里,推荐使用 update_one()update_many() 方法

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
condition = {'name': 'TRHX'}
student = collection.find_one(condition)
student['age'] = 19
result = collection.update_one(condition, {'$set': student})
print(result)
print(result.matched_count, result.modified_count)

注意:update_one() 方法不能直接传入修改后的字典,只能使用 {'$set': student} 的形式传入,可以调用 matched_countmodified_count 属性,获取匹配的数据条数和影响的数据条数:

<pymongo.results.UpdateResult object at 0x00000235A1684508>
1 1

使用update_many() 方法可以将所有符合条件的数据都更新:

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
condition = {'age': {'$gt': 18}}
result = collection.update_many(condition, {'$set': {'age': 25}})
print(result)
print(result.matched_count, result.modified_count)

匹配所有年龄大于 18 的数据,更新条件为将这些所有满足条件的年龄都设置成 25,输出结果如下:

<pymongo.results.UpdateResult object at 0x00000285CECC45C8>
4 4

【11.11】删除数据

调用 remove() 方法并指定删除的条件,此时符合条件的所有数据均会被删除

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
result = collection.remove({'name': 'CCC'})
print(result)

输出结果:

{'n': 1, 'ok': 1.0}

同样的,在 PyMongo 3.x 版本里,推荐使用 delete_one()delete_many() 方法

import pymongoclient = pymongo.MongoClient(host='localhost', port=27017)
db = client.spiders
collection = db.students
result = collection.delete_one({'name': 'AAA'})
print(result)
print(result.deleted_count)
result = collection.delete_many({'gender': 'female'})
print(result.deleted_count)

调用 deleted_count 属性可以获取删除的数据条数,输出结果:

<pymongo.results.DeleteResult object at 0x0000024441B245C8>
1
1

PyMongo 官方文档:http://api.mongodb.com/python/current/api/pymongo/collection.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Sharepoin学习笔记—架构系列--04 Sharepoint的四种执行模型 1

Sharepoint210有四种执行模型 1、完全信任执行模型(Full Trust) 2、Bin/CAS 执行模型 &#xff08;1与2都属于场解决方案&#xff09; 3、沙盒执行模型(Sand Box) 4、 混合执行方法 (Hybrid Approach) 下面分别来看看它们是怎么回事 一、场解决方案 场解决方案是在 Share…

Python3 爬虫学习笔记 C12【验证码对抗系列 — 图形验证码】

Python3 爬虫学习笔记第十二章 —— 【验证码对抗系列 — 图形验证码】文章目录【12.1】关于普通图形验证码【12.2】tesserocr 库识别验证码【12.3】pytesseract 库识别验证码【12.4】验证码处理【12.5】tesserocr 与 pytesserocr 相关资料【12.1】关于普通图形验证码 普通图形…

Sharepoin学习笔记—架构系列--05 Sharepoint的四种执行模型 2

上一篇我们看了场解决方案与沙盒方案两种执行模型&#xff0c;其中场解决方案包括有完全信任方式与Bin/CAS方式两种&#xff0c;这里让我们继续来看看最后一个执行模型&#xff0c;即混合模型(或混合模式)。 三、混合模式&#xff08;hybrid approaches&#xff09; 所谓混合模…

Python3 爬虫学习笔记 C13【验证码对抗系列 — 滑动验证码】

Python3 爬虫学习笔记第十三章 —— 【验证码对抗系列 — 滑动验证码】文章目录【13.1】关于滑动验证码【13.2】滑动验证码攻克思路【13.3】模拟登录 bilibili — 总体思路【13.4】主函数【13.5】初始化函数【13.6】登录函数【13.7】验证码元素查找函数【13.8】元素可见性设置函…

Sharepoin学习笔记—架构系列—06 Sharepoint服务(Services)与服务应用程序框架(Service Application Framework) 1

Sharepoint服务是Sharepoint的重要组成&#xff0c;可以说Sharepoint的许多网站功能都是基于这些服务构架起来的。这里把Sharepoint服务的相关要点总结一下。 1、什么是 SharePoint 服务&#xff1f; SharePoint 服务是一项 IT 服务&#xff0c;它是运行在后台&#xff0c;为调…

Python3 爬虫学习笔记 C14【验证码对抗系列 — 点触验证码】

Python3 爬虫学习笔记第十四章 —— 【验证码对抗系列 — 点触验证码】文章目录【14.1】关于点触验证码【14.2】点触验证码攻克思路【14.3】模拟登录 12306 — 总体思路【14.4】主函数【14.5】初始化函数【14.6】破解入口函数【14.7】账号密码输入函数【14.8】页面截图函数【14…

Sharepoin学习笔记—架构系列—07nSharepoint服务(Services)与服务应用程序框架(Service Application Framework) 2

上一篇我们以问答的方式明确了Sharepoint服务的一些概念&#xff0c;这里我们重点来看两个方面:Sharepoint服务器构架对象模型以及Sharepoint 服务应用程序的某些拓扑结构 一、Sharepoint服务器构架对象模型 转存失败重新上传取消 二、Sharepoint 服务应用程序的某些拓扑结…

Sharepoin学习笔记—架构系列--08 Sharepoint的数据模型(DataModel)、数据管理(Data Management)与查询(Query System)

Sharepoint Foundation中的首要数据结构就是列表(List), 每个List属于某种List Type&#xff0c;与此类似&#xff0c;每个列表中的列(Column)属于某种FieldType&#xff0c;而每一条列表记录(List Item)属于某种Content Type.至于外部数据(External Data)&#xff0c;即来自于…

执行 redis-dump 报错:ERROR (Errno::ENOENT): No such file or directory - ps -o rss= -p xxxxx

redis-dump 命令用于 Redis 数据的导出&#xff0c;执行该命令时报错如下&#xff1a; C:\Users\Lenovo>redis-dump -u 127.0.0.1:6379 ERROR (Errno::ENOENT): No such file or directory - ps -o rss -p 3944解决方法&#xff1a;找到 Ruby 安装目录下的 dump.rb 文件&a…

Sharepoint学习笔记 –架构系列—09 Sharepoint的服务器端对象模型(Server Object Model) 1.物理对象层次结构

关于Sharepoint的服务器端对象模型的内容很庞大很繁杂&#xff0c;而事实上&#xff0c;我们在这里只把最关键的对象梳理一下&#xff0c;我们会从三个体系来大致描述它们。 这三个体系分别是&#xff1a; 1、物理对象层次结构(Physical Objects Hierarchy) 2、内容层次结构(Co…

执行 redis-dump 报错:Error connecting to Redis on localhost:6379 (Redis::TimeoutError)

拿本地的 Redis 做测试&#xff0c;运行在 6379 端口上&#xff0c;使用 redis-dump -u localhost:6379 命令用于数据的导出&#xff0c;执行该命令时报错如下&#xff1a; C:\Users\Lenovo>redis-dump -u localhost:6379 Error connecting to Redis on localhost:6379 (Re…

Sharepoint学习笔记 –架构系列—10 Sharepoint的服务器端对象模型(Server Object Model) 2.内容层次结构

Sharepoint的内容层次结构&#xff08;Content Hierarchy&#xff09;包括表示可发布数据项(publishable items)&#xff0c;如列表项的类&#xff0c;还包括表示嵌套的数据容器(nested containers of data),如列表、内容数据库、网站、网站集以及称为"Web 应用程序"…

Sharepoint学习笔记 –架构系列—11 Sharepoint的服务器端对象模型(Server Object Model) 3.服务层次结构

前面我们看了一下Sharepoint服务器对象模型的物理对象层次(Physical Objects Hierarchy)和对象内容层次(Content Hierarchy)中的相关类&#xff0c;这里来看看服务层次结构&#xff0c;其中包括表示 Web 服务(WebService)、Windows 服务(WindowService)、其他类型的服务(Icomin…

pyspider all 启动失败:ValueError: Invalid configuration

执行 pyspider all 启动命令报错如下&#xff1a; C:\Users\Lenovo>pyspider all e:\python\lib\site-packages\pyspider\libs\utils.py:196: FutureWarning: timeout is not supported on your platform.warnings.warn("timeout is not supported on your platform.&…

Sharepoint学习笔记 –架构系列—12 Sharepoint的客户端对象模型(Client Object Model)

前面过了一下Sharepoint的服务器端对象模型&#xff0c;接下来就让我们大致看看Sharepoint的客户端对象模型(Client Object Model: Client OM)。 首先需要了解的就是Sharepoint的客户端模型是在Sharepoint2010才开始引入的&#xff0c;之前没有这个概念。 一、为什么要引入客户…

Hexo 双线部署到 Coding Pages 和 GitHub Pages 并实现全站 HTTPS

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/&#xff0c;文章距上次编辑时间较远&#xff0c;部分内容可能已经过时&#xff01; 我的博客地址&#xff1a;https://www.itrhx.com/ 部署到 Coding Pages 的好处&#xff1a;国内访问速度更快&…

Git得基本使用方法add、commit、push、checkout以及Pull

一、Git是什么&#xff1f; Git是目前世界上最先进的分布式版本控制系统。 Working Directory&#xff1a;工作区 Index / Stage&#xff1a;暂存区 Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09; Remote&#xff1a;远程仓库 由于前面2篇文章已经简单得…

Coding Pages 申请 SSL 证书错误:urn:acme:error:unauthorized: Invalid response from http://xxxxx/

Coding Pages 申请 SSL/TLS 安全证书出现以下错误&#xff1a; urn:acme:error:unauthorized: Invalid response from http://www.xxxx.cn/.well-known/acme-challenge/ysOz9wW3U_GFPP8kRP4w8uknBZ9UfiUT7t2xpu9pDCw [185.199.111.153]: "\n\n \n <meta http-equiv“Co…

Hexo 博客提交百度、谷歌搜索引擎收录

2022-01-25 更新&#xff1a;博客新地址&#xff1a;https://www.itbob.cn/&#xff0c;文章距上次编辑时间较远&#xff0c;部分内容可能已经过时&#xff01; 文章目录● 写在前面&#xff08;必看&#xff09;● 查看网站是否被收录● 百度资源平台添加网站● 提交百度搜索●…

工作区、暂存区、版本库、远程仓库

一、概念 1、四个工作区域 Git本地有四个工作区域&#xff1a;工作目录&#xff08;Working Directory&#xff09;、暂存区(Stage/Index)、资源库(Repository或Git Directory)、git仓库(Remote Directory)。文件在这四个区域之间的转换关系如下&#xff1a; Workspace&#x…