【Python爬虫(23)】探秘Python爬虫数据存储:MongoDB实战指南
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。
目录
- 一、MongoDB 初印象
- 二、开启 MongoDB 之旅:安装与启动
- 2.1 下载与安装
- 2.2 配置环境变量
- 2.3 启动服务
- 2.4 连接数据库
- 三、Python 与 MongoDB 的奇妙联动:pymongo 库的使用
- 3.1 安装 pymongo 库
- 3.2 连接 MongoDB 数据库
- 3.3 选择数据库和集合
- 四、文档型数据的存储与查询艺术
- 4.1 插入文档
- 4.1.1 插入单条数据
- 4.1.2 插入多条数据
- 4.2 查询文档
- 4.2.1 查询所有文档
- 4.2.2 查询单个文档
- 4.2.3 带条件查询
- 4.2.4 模糊查询
- 4.3 更新文档
- 4.3.1 更新单个文档
- 4.3.2 更新多个文档
- 4.4 删除文档
- 4.4.1 删除单个文档
- 4.4.2 删除多个文档
- 五、总结与展望
一、MongoDB 初印象
在当今大数据蓬勃发展的时代,数据量呈爆炸式增长,数据类型也变得丰富多样。面对海量且复杂的数据,传统的关系型数据库在处理能力和灵活性上逐渐显露出局限性。非关系型数据库应运而生,MongoDB 便是其中的佼佼者,在众多领域中发挥着重要作用。
MongoDB 是一款基于分布式文件存储的开源文档型数据库,它使用二进制 JSON(BSON)作为存储格式,这种格式在保留 JSON 灵活性的同时,还具备更高的存储和传输效率 。与传统关系型数据库相比,MongoDB 有着诸多显著优势。例如,它的文档模型非常灵活,无需预先定义严格的表结构,这使得存储和处理各种非结构化和半结构化数据变得轻而易举。在爬虫数据存储方面,爬虫抓取到的数据往往结构多变,使用 MongoDB 就可以轻松应对,无需频繁修改数据库结构。
此外,MongoDB 具备出色的水平扩展性,通过分片(Sharding)技术,能够将数据分散存储在多个服务器节点上,从而有效应对海量数据的存储和高并发访问需求,确保系统在数据量增长时仍能保持良好的性能。它还支持丰富的查询操作符和聚合管道,能够满足复杂的数据查询和分析需求,为后续的数据处理和挖掘提供强大支持。
在爬虫应用场景中,选择 MongoDB 存储数据有着诸多考量。爬虫抓取的数据通常包含网页内容、图片链接、商品信息等各种类型,数据结构差异较大。MongoDB 灵活的文档模型可以很好地适应这些数据,方便数据的存储和管理。同时,随着爬虫规模的扩大和数据量的不断增加,MongoDB 的水平扩展能力能够保障系统的稳定运行,不会因为数据量的增长而导致性能瓶颈。例如,在一些大型电商爬虫项目中,需要处理海量的商品数据,MongoDB 的高性能读写和扩展性就能够确保数据的快速存储和高效查询,为后续的数据分析和商业决策提供有力支持。
二、开启 MongoDB 之旅:安装与启动
在深入了解 MongoDB 的强大功能之前,我们首先需要完成它的安装与启动,并掌握连接数据库的方法。这是我们后续使用 MongoDB 进行数据存储和管理的基础。下面将详细介绍在不同操作系统下完成这些操作的具体步骤。
2.1 下载与安装
- Windows 系统:访问 MongoDB 官方网站(https://www.mongodb.com/try/download/community ),根据 Windows 操作系统版本(32 位或 64 位)选择合适的 MongoDB Community Server 安装包进行下载。下载完成后,双击安装包(.msi 文件)启动安装向导。在安装过程中,可自定义安装路径,默认路径为 C:\Program Files\MongoDB\Server\ 。同时,可选择是否将 MongoDB 安装为服务,安装为服务后系统启动时 MongoDB 会自动运行。
- Linux 系统(以 Ubuntu 为例):首先导入公钥,以确保软件包的完整性和真实性。在终端运行命令:wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add - 。对于较新的 Ubuntu 版本,可能需要使用 curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor 。接着创建列表文件,在 /etc/apt/sources.list.d/ 目录下创建 mongodb-org-6.0.list 文件,并添加内容 deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse (注意:focal 是 Ubuntu 20.04 的代号,若使用其他版本 Ubuntu,需替换为相应代号 )。完成上述步骤后,更新软件包列表并安装 MongoDB,运行命令 sudo apt-get update 和 sudo apt-get install -y mongodb-org。
- macOS 系统:推荐使用 Homebrew 安装。如果 Mac 未安装 Homebrew,先打开终端并按照官网(https://brew.sh/ )指引安装。安装 Homebrew 后,在终端运行 brew tap mongodb/brew 和 brew install mongodb-community@6.0 (这里以安装 MongoDB 6.0 为例,可根据需求替换版本号)。也可手动安装,访问 MongoDB 官方网站下载适合 macOS 的.tgz 安装包,解压后将文件移动到合适位置(如 /usr/local/mongodb )。
2.2 配置环境变量
安装完成后,需要将 MongoDB 的二进制文件目录添加到系统的环境变量 PATH 中,这样才能在命令提示符的任何目录下运行 MongoDB 相关命令。
- Windows 系统:右键点击 “此电脑”,选择 “属性”,在弹出窗口中点击 “高级系统设置”。在 “系统属性” 窗口中选择 “环境变量”,在 “系统变量” 中找到 “Path” 变量并点击 “编辑”。点击 “新建”,将 MongoDB 的 bin 目录路径(如 C:\Program Files\MongoDB\Server\your_version\bin )添加进去,然后依次点击 “确定” 保存设置。
- Linux 系统:打开终端,编辑 .bashrc 文件(如果使用 zsh,则编辑 .zshrc 文件),在文件末尾添加 export PATH=/your_mongodb_install_path/bin:$PATH (将 /your_mongodb_install_path 替换为实际的 MongoDB 安装路径)。保存文件后,运行 source ~/.bashrc (或 source ~/.zshrc )使配置生效。
- macOS 系统:若使用 Homebrew 安装,Homebrew 会自动配置环境变量。手动安装时,编辑 ~/.bash_profile (或 ~/.zshrc )文件,添加 export PATH=/usr/local/mongodb/bin:$PATH ,然后运行 source ~/.bash_profile (或 source ~/.zshrc )使配置生效。
2.3 启动服务
- Windows 系统:如果在安装过程中选择将 MongoDB 安装为服务,可通过 “服务” 窗口找到 MongoDB 服务并启动,也可在命令提示符中以管理员身份运行 net start MongoDB 来启动服务。若未安装为服务,打开命令提示符,进入 MongoDB 的安装目录下的 bin 文件夹,运行 mongod.exe 来启动 MongoDB 数据库服务。也可以指定数据存储路径,例如:mongod --dbpath C:\data\db (假设数据存储路径为 C:\data\db )。
- Linux 系统:安装完成后,使用命令 sudo service mongod start 启动 MongoDB 服务,或者使用 systemctl 命令(适用于使用 systemd 的系统):sudo systemctl start mongod 。
- macOS 系统:使用 Homebrew 安装的,可通过 brew services start mongodb-community@6.0 启动服务(版本号根据实际安装情况修改)。手动安装的,在终端进入 MongoDB 的二进制文件目录,运行 mongod 命令来启动服务,也可指定数据存储路径,如 mongod --dbpath /usr/local/mongodb/data/db 。
2.4 连接数据库
- 命令行工具连接:在启动 MongoDB 服务后,打开新的命令行窗口,运行 mongo 命令即可连接到本地默认的 MongoDB 数据库,默认端口为 27017。如果要连接到特定的数据库,可以使用 mongo yourDatabaseName (将 yourDatabaseName 替换为实际的数据库名称)。如果 MongoDB 设置了用户名和密码,连接时需要指定用户名和密码,例如:mongosh --host localhost:27017 -u root -p ‘yourpassword’ 。
- 可视化客户端连接:以 Robo 3T 为例,启动 Robo 3T 工具后,点击界面左上角的 “Create” 按钮创建一个新的连接。在弹出的对话框中,填写连接信息:“Name” 为连接的名称,可自定义;“Address” 为 MongoDB 服务器的地址,可以是 IP 地址或者域名;“Port” 为 MongoDB 服务器的端口号,默认为 27017;如果需要身份验证,勾选 “Authentication”,并填写 “Database”(要连接的数据库名称)、“User Name”(用户名)和 “Password”(密码)。填写完毕后,点击 “Save” 按钮保存连接,然后在左侧连接列表中双击该连接,即可连接到 MongoDB 数据库 。
三、Python 与 MongoDB 的奇妙联动:pymongo 库的使用
在成功安装并启动 MongoDB 后,我们就可以使用 Python 来操作它了。pymongo 库是 Python 操作 MongoDB 的官方驱动,提供了丰富的方法来实现对 MongoDB 数据库的各种操作。下面将详细介绍如何使用 pymongo 库来连接 MongoDB 数据库、选择数据库和集合,并进行基本的数据操作。
3.1 安装 pymongo 库
在使用 pymongo 库之前,首先需要确保它已经安装在你的 Python 环境中。如果你使用的是 pip 包管理器,安装过程非常简单,只需在命令行中执行以下命令:
pip install pymongo
如果你的系统中同时安装了 Python2 和 Python3,并且希望使用 pip3 来安装 pymongo 库,可以使用以下命令:
pip3 install pymongo
安装完成后,你可以在 Python 交互式环境中导入 pymongo 库来验证是否安装成功:
import pymongo
如果没有报错,说明 pymongo 库已经成功安装。
3.2 连接 MongoDB 数据库
安装好 pymongo 库后,我们就可以在 Python 代码中连接 MongoDB 数据库了。在 pymongo 库中,使用 MongoClient 类来建立与 MongoDB 服务器的连接。如果 MongoDB 运行在本地,并且使用默认的端口号 27017,连接代码非常简单:
from pymongo import MongoClient# 连接本地MongoDB服务器
client = MongoClient()
上述代码创建了一个 MongoClient 对象,它默认连接到本地主机(localhost)的 27017 端口。如果 MongoDB 服务器运行在其他主机上,或者使用了非默认端口,你需要在 MongoClient 的构造函数中指定主机地址和端口号 。例如,MongoDB 服务器运行在 192.168.1.100 ,端口号为 27018 ,连接代码如下:
from pymongo import MongoClient# 连接到指定主机和端口的MongoDB服务器
client = MongoClient('192.168.1.100', 27018)
如果 MongoDB 设置了用户名和密码,还需要在连接字符串中添加认证信息。假设用户名是 user ,密码是 password ,连接代码如下:
from pymongo import MongoClient# 连接到指定主机和端口的MongoDB服务器,并进行认证
client = MongoClient('mongodb://user:password@192.168.1.100:27018/')
3.3 选择数据库和集合
连接到 MongoDB 服务器后,接下来需要选择要操作的数据库和集合。在 pymongo 库中,通过 MongoClient 对象来选择数据库。如果数据库不存在,MongoDB 会在插入数据时自动创建。选择数据库的方式有两种,一种是使用属性访问的方式,另一种是使用字典访问的方式。假设我们要选择名为 test_db 的数据库,代码如下:
# 使用属性访问方式选择数据库
db1 = client.test_db# 使用字典访问方式选择数据库
db2 = client['test_db']
这两种方式是等效的,你可以根据自己的喜好选择使用。选择数据库后,就可以选择集合了。集合类似于关系型数据库中的表,是存储文档的地方。同样,选择集合也有两种方式。假设我们要选择名为 test_collection 的集合,代码如下:
# 使用属性访问方式选择集合
collection1 = db1.test_collection# 使用字典访问方式选择集合
collection2 = db1['test_collection']
如果集合不存在,MongoDB 会在插入数据时自动创建。例如,我们可以通过以下代码向集合中插入一条数据,从而创建集合:
data = {'name': '张三', 'age': 20}
collection2.insert_one(data)
上述代码向 test_collection 集合中插入了一条数据,如果 test_collection 集合不存在,MongoDB 会自动创建它 。
四、文档型数据的存储与查询艺术
在掌握了 Python 与 MongoDB 的连接以及 pymongo 库的基本使用方法后,我们就可以深入探讨如何在 MongoDB 中进行文档型数据的存储与查询操作了。这部分内容是使用 MongoDB 进行数据管理的核心,包括插入文档、查询文档、更新文档和删除文档等操作,下面将详细介绍这些操作的具体实现方式。
4.1 插入文档
在 MongoDB 中,插入文档是将数据存储到集合中的基本操作。pymongo 库提供了insert_one()和insert_many()方法,分别用于插入单条数据和多条数据。
4.1.1 插入单条数据
使用insert_one()方法可以向集合中插入一条文档数据。该方法接受一个字典作为参数,字典中的键值对即为文档的字段和对应的值。例如,我们向名为students的集合中插入一条学生信息的代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 要插入的学生信息
student = {'name': '张三','age': 20,'gender': '男','major': '计算机科学'
}# 插入单条数据
result = collection.insert_one(student)
print(f"插入的文档ID: {result.inserted_id}")
在上述代码中,首先创建了一个student字典,包含学生的各项信息。然后使用insert_one()方法将该字典插入到students集合中,insert_one()方法返回一个InsertOneResult对象,通过该对象的inserted_id属性可以获取插入文档的唯一标识符。
4.1.2 插入多条数据
当需要插入多条数据时,可以使用insert_many()方法。该方法接受一个包含多个字典的列表作为参数,每个字典代表一条文档数据。例如,我们向students集合中插入多条学生信息的代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 要插入的多条学生信息
students = [{'name': '李四','age': 21,'gender': '女','major': '数学'},{'name': '王五','age': 19,'gender': '男','major': '英语'},{'name': '赵六','age': 22,'gender': '女','major': '物理学'}
]# 插入多条数据
result = collection.insert_many(students)
print(f"插入的文档ID列表: {result.inserted_ids}")
在这段代码中,定义了一个包含三个学生信息字典的列表students,然后使用insert_many()方法将这些数据插入到students集合中。insert_many()方法返回一个InsertManyResult对象,通过其inserted_ids属性可以获取插入的多个文档的唯一标识符列表。
4.2 查询文档
查询文档是从 MongoDB 集合中获取数据的重要操作。pymongo 库提供了丰富的查询方法,如find()和find_one(),可以满足各种查询需求,包括查询所有文档、查询单个文档、带条件查询和模糊查询等。
4.2.1 查询所有文档
使用find()方法并传入一个空的查询条件(即{}),可以查询集合中的所有文档。find()方法返回一个游标对象,通过遍历该游标可以获取每个文档。例如,查询students集合中所有学生信息的代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 查询所有文档
results = collection.find({})
for result in results:print(result)
上述代码中,collection.find({})返回一个包含所有学生文档的游标,通过for循环遍历该游标,将每个学生文档打印出来。
4.2.2 查询单个文档
find_one()方法用于查询集合中的单个文档,它返回满足查询条件的第一个文档。如果不传入查询条件,则返回集合中的第一个文档。例如,查询students集合中名为 “张三” 的学生信息的代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 查询单个文档
result = collection.find_one({'name': '张三'})
print(result)
在这段代码中,collection.find_one({‘name’: ‘张三’})根据name字段为 “张三” 的条件查询文档,并返回第一个匹配的文档。
4.2.3 带条件查询
在实际应用中,常常需要根据特定条件查询文档。可以在find()方法中传入一个查询条件字典来实现带条件查询。例如,查询students集合中年龄大于 20 岁的学生信息的代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 带条件查询
query = {'age': {'$gt': 20}}
results = collection.find(query)
for result in results:print(result)
上述代码中,定义了一个查询条件query,其中’$gt’是 MongoDB 的查询操作符,表示大于。collection.find(query)根据该条件查询文档,并返回所有年龄大于 20 岁的学生文档。
常用的查询操作符还有很多,比如:
- $eq:等于,例如{‘age’: {‘$eq’: 20}}表示查询年龄等于 20 岁的文档。
- $ne:不等于,例如{‘age’: {‘$ne’: 20}}表示查询年龄不等于 20 岁的文档。
- $lt:小于,例如{‘age’: {‘$lt’: 20}}表示查询年龄小于 20 岁的文档。
- $lte:小于等于,例如{‘age’: {‘$lte’: 20}}表示查询年龄小于等于 20 岁的文档。
- $in:在指定数组内,例如{‘age’: {‘$in’: [20, 22]}}表示查询年龄为 20 岁或 22 岁的文档。
- $nin:不在指定数组内,例如{‘age’: {‘$nin’: [20, 22]}}表示查询年龄不是 20 岁和 22 岁的文档。
4.2.4 模糊查询
在查询字符串类型的字段时,经常需要进行模糊查询。MongoDB 支持使用正则表达式或$regex操作符来实现模糊查询。例如,查询students集合中姓名以 “张” 开头的学生信息的代码如下:
from pymongo import MongoClient
import re# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 模糊查询
query = {'name': re.compile('^张')}
results = collection.find(query)
for result in results:print(result)
在上述代码中,使用re.compile(‘^张’)创建了一个正则表达式对象,表示匹配以 “张” 开头的字符串。collection.find(query)根据该正则表达式条件查询文档,并返回所有姓名以 “张” 开头的学生文档。
也可以使用$regex操作符来实现相同的功能,代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 模糊查询
query = {'name': {'$regex': '^张'}}
results = collection.find(query)
for result in results:print(result)
这两种方式都能实现模糊查询,你可以根据自己的习惯选择使用。
4.3 更新文档
在 MongoDB 中,更新文档是对已存储的数据进行修改的操作。pymongo 库提供了update_one()和update_many()方法,分别用于更新单个文档和多个文档。
4.3.1 更新单个文档
update_one()方法用于更新满足查询条件的第一个文档。它接受两个参数,第一个参数是查询条件,第二个参数是更新操作符和要更新的值组成的字典。例如,将students集合中名为 “张三” 的学生年龄更新为 21 岁的代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 更新单个文档
filter = {'name': '张三'}
update = {'$set': {'age': 21}}
result = collection.update_one(filter, update)
print(f"匹配的文档数: {result.matched_count}")
print(f"修改的文档数: {result.modified_count}")
在上述代码中,filter是查询条件,用于确定要更新的文档。update是更新操作,使用’$set’操作符表示设置字段的值,将age字段更新为 21。update_one()方法返回一个UpdateResult对象,通过其matched_count属性可以获取匹配的文档数,modified_count属性可以获取实际修改的文档数。
4.3.2 更新多个文档
update_many()方法用于更新满足查询条件的所有文档,其使用方法与update_one()类似。例如,将students集合中所有年龄大于 20 岁的学生专业更新为 “信息与计算科学” 的代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 更新多个文档
filter = {'age': {'$gt': 20}}
update = {'$set': {'major': '信息与计算科学'}}
result = collection.update_many(filter, update)
print(f"匹配的文档数: {result.matched_count}")
print(f"修改的文档数: {result.modified_count}")
在这段代码中,filter指定了查询条件,即年龄大于 20 岁的学生。update指定了更新操作,将这些学生的major字段更新为 “信息与计算科学”。update_many()方法返回的UpdateResult对象同样包含matched_count和modified_count属性,用于获取匹配和修改的文档数量。
4.4 删除文档
删除文档是从 MongoDB 集合中移除数据的操作。pymongo 库提供了delete_one()和delete_many()方法,分别用于删除单个文档和多个文档。
4.4.1 删除单个文档
delete_one()方法用于删除满足查询条件的第一个文档。例如,删除students集合中名为 “张三” 的学生信息的代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 删除单个文档
filter = {'name': '张三'}
result = collection.delete_one(filter)
print(f"删除的文档数: {result.deleted_count}")
在上述代码中,filter是查询条件,用于确定要删除的文档。delete_one()方法返回一个DeleteResult对象,通过其deleted_count属性可以获取删除的文档数。
4.4.2 删除多个文档
delete_many()方法用于删除满足查询条件的所有文档。例如,删除students集合中所有年龄小于 18 岁的学生信息的代码如下:
from pymongo import MongoClient# 连接MongoDB服务器
client = MongoClient('mongodb://localhost:27017/')
# 选择数据库
db = client['school']
# 选择集合
collection = db['students']# 删除多个文档
filter = {'age': {'$lt': 18}}
result = collection.delete_many(filter)
print(f"删除的文档数: {result.deleted_count}")
在这段代码中,filter指定了查询条件,即年龄小于 18 岁的学生。delete_many()方法返回的DeleteResult对象的deleted_count属性表示删除的文档数量。通过这种方式,可以一次性删除多个符合条件的文档。
五、总结与展望
通过本文的学习,我们深入了解了 MongoDB 在 Python 爬虫数据存储中的应用。MongoDB 以其灵活的文档模型、出色的扩展性和丰富的查询功能,成为爬虫数据存储的理想选择。我们从 MongoDB 的安装与启动开始,逐步掌握了使用 Python 的 pymongo 库进行数据库连接、文档操作等核心技能。无论是插入、查询、更新还是删除文档,MongoDB 都提供了简洁高效的操作方法,使得我们能够轻松地管理和处理爬虫获取到的数据。
展望未来,随着大数据和人工智能技术的飞速发展,数据的规模和复杂性将持续增长。MongoDB 有望在这一趋势下,继续发挥其优势,并在数据处理领域展现出更多的可能性。在云计算和云原生领域,MongoDB 将进一步强化其云原生特性,与各种云服务深度融合,提供更高效、更便捷的托管服务。这将使得开发者能够更加轻松地在云端部署和管理 MongoDB 数据库,降低运维成本,提高开发效率。
在人工智能与大数据分析方面,MongoDB 可能会与机器学习、深度学习算法更紧密地结合。通过提供内置的数据分析和处理功能,MongoDB 将帮助用户更快速地从海量数据中提取有价值的信息,为智能决策提供支持。例如,在实时数据分析场景中,MongoDB 的高性能读写能力和丰富的查询操作符,将能够满足对实时数据处理和分析的需求,助力企业实现业务的实时监控和快速响应。
在数据安全和隐私保护日益重要的今天,MongoDB 也将不断加强其安全功能。通过更严格的数据加密、精细化的权限管理和强大的身份验证机制,MongoDB 将确保数据在存储和传输过程中的安全性,防止数据泄露和未经授权的访问。
MongoDB 在 Python 爬虫数据存储及未来数据处理领域前景广阔。希望读者能够通过本文的学习,掌握 MongoDB 的基本操作和应用,为后续在实际项目中的应用打下坚实的基础。在不断变化的技术领域中,持续关注 MongoDB 的发展动态,探索其更多的应用场景和创新用法,将有助于我们更好地应对大数据时代的数据管理挑战。
相关文章:
【Python爬虫(23)】探秘Python爬虫数据存储:MongoDB实战指南
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Pytorch使用手册-音频数据增强(专题二十)
音频数据增强 torchaudio 提供了多种方式来增强音频数据。 在本教程中,我们将介绍一种应用效果、滤波器、RIR(房间脉冲响应)和编解码器的方法。 最后,我们将从干净的语音合成带噪声的电话语音。 import torch import torchaudio import torchaudio.functional as Fprin…...
Linux 命令大全完整版(04)
1. 用户信息相关命令 who 功能说明:显示目前登入系统的用户信息。语 法:who [-Himqsw][--help][--version][am i][记录文件]补充说明:执行这项指令可得知目前有哪些用户登入系统,单独执行 who 指令会列出登入帐号、使用的终端…...
嵌入式Linux内核底层调试技术Kprobes
大家好,我是bug菌~ Kprobes 是 Linux 内核中一种动态插桩(Dynamic Instrumentation)技术,允许在不修改内核源码或重启系统的前提下,动态监控内核函数的执行。它是内核调试、性能分析和安全监控的重要工具。以下从技术…...
leetcode 119. 杨辉三角 II
给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1]提示…...
内网网络安全的解决之道
本文简要分析了企业内部网络所面临的主要分析,阐述了安全管理人员针对不同威胁的主要技术应对措施。进一步介绍了业界各种技术措施的现状,并提出了未来可能的发展趋势。 内网网络安全问题的提出 网络安全对于绝大多数人而言指的都是互联网安全ÿ…...
分布式光纤声波振动技术在钻井泄漏检测中的应用
在石油天然气的钻井作业中,及时发现并定位泄漏点对于保障开采安全、降低环境污染以及避免经济损失至关重要。传统的泄漏检测方法往往存在局限性,而分布式光纤声波振动技术凭借其独特的优势,正逐渐成为钻井过程中寻找泄漏的有力工具。 技术原理…...
deepseek 导出导入模型(Windows)
前言 实现导出导入deepseek 模型。deepseek 安装Windows下参考 Windows 导出模型 Restart-Service 重启服务参考Stop-Service 关闭服务参考Start-Service 确定服务参考Compress-Archive 压缩参考Expand-Archive 解压参考setx 环境变量参考C:\Users\用户名\.ollama\models 默…...
Spring MVC配置文件
1. DispatcherServlet配置 作用:DispatcherServlet是Spring MVC的核心前端控制器,用于接收所有HTTP请求,并将请求分发给对应的处理器(Controller)。 配置方式: 在web.xml中配置DispatcherServletÿ…...
计算机视觉:主流数据集整理
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络(附代码) 第五章࿱…...
基于AT89C52单片机的出租车计价器
点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90419909?spm1001.2014.3001.5501 C17 部分参考设计如下: 摘要 随着城市交通行业的迅速发展,出租车作为最主要的城市公共交通工具之一…...
C++入门基础课程讲解
C编程入门课程 | 码学堂 竞赛名师授课,不仅涵盖了从零开始学习C的所有必要知识点,还深入探讨了基础算法及其应用,课程内容包括: (1)编程及上机平台介绍:包括推荐使用的IDE和在线编译器…...
Graspness Discovery in Clutters for Fast and Accurate Grasp Detection 解读
研究背景 研究问题 :这篇文章要解决的问题是如何在杂乱的环境中快速且准确地检测抓取姿态。传统的 6自由度抓取方法将场景中的所有点视为平等,并采用均匀采样来选择抓取候选点,但忽略了抓取位置的重要性,这极大地影响了抓取姿态检…...
MyBatis的CRUD
1. what MyBatis是一款优秀的持久层框架,它支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射实体类型、接口、Java POJO(Plain Old Java Objects,普…...
leetcode 题目解析 第3题 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”…...
深度学习入门--神经网络
初学,若有错误,恳请指正。 目录 初学,若有错误,恳请指正。 3.1 从感知机到神经网络 3.1.1 神经网络的例子 3.1.2 复习感知机 3.1.3 激活函数登场 3.2 激活函数 3.2.1 sigmoid 函数 3.2.2 阶跃函数的实现 3.2.3 阶跃函数…...
pycharm 调试 debug 进入 remote_sources
解决办法1: pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"(此时文件夹会变为蓝色)。 解决方法2 Debug:使用Pychar…...
【复习】计算机网络
网络模型 OSI 应用层:给应用程序提供统一的接口表示层:把数据转换成兼容另一个系统能识别的格式会话层:负责建立、管理、终止表示层实体之间的通信会话传输层:负责端到端的数据传输网络层:负责数据的路由、转发、分片…...
CentOS停服后的替代选择:openEuler、Rocky Linux及其他系统的未来展望
CentOS停服后的替代选择:openEuler、Rocky Linux及其他系统的未来展望 引言CentOS停服的背景华为openEuler:面向未来的开源操作系统1. 简介2. 特点3. 发展趋势 Rocky Linux:CentOS的精神继承者1. 简介2. 特点3. 发展趋势 其他可选的替代系统1…...
ollama+open-webui,本地部署自己的大模型
目录 一、效果预览 二、部署ollama 1.ollama说明 2.安装流程 2.1 windows系统 2.1.1下载安装包 2.1.2验证安装结果 2.1.3设置模型文件保存地址 2.1.4拉取大模型镜像 2.2linux系统 2.2.1下载并安装ollama 2.2.2设置环境变量 2.2.3拉取模型文件 三、部署open-webui…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
数据挖掘是什么?数据挖掘技术有哪些?
目录 一、数据挖掘是什么 二、常见的数据挖掘技术 1. 关联规则挖掘 2. 分类算法 3. 聚类分析 4. 回归分析 三、数据挖掘的应用领域 1. 商业领域 2. 医疗领域 3. 金融领域 4. 其他领域 四、数据挖掘面临的挑战和未来趋势 1. 面临的挑战 2. 未来趋势 五、总结 数据…...
电脑定时关机工具推荐
软件介绍 本文介绍一款轻量级的电脑自动关机工具,无需安装,使用简单,可满足定时关机需求。 工具简介 这款关机助手是一款无需安装的小型软件,文件体积仅60KB,下载后可直接运行,无需复杂配置。 使用…...
