Python爬虫(10)Python数据存储实战:基于pymongo的MongoDB开发深度指南

目录

      • 一、为什么需要文档型数据库?
        • 1.1 数据存储的范式变革
        • 1.2 pymongo的核心优势
      • 二、pymongo核心操作全解析
        • 2.1 环境准备
        • 2.2 数据库连接与CRUD操作
        • 2.3 聚合管道实战
        • 2.4 分批次插入百万级数据(进阶)
        • 2.5 分批次插入百万级数据(进阶)
      • 三、生产环境进阶配置
        • 3.1 性能优化关键措施
        • 3.2 高可用架构配置
        • 3.3 安全加固方案
      • 四、总结与最佳实践
        • 4.1 技术选型对比‌:
        • 4.2 性能优化原则‌:
        • 4‌.3 避坑指南‌:
        • Python爬虫相关文章(推荐)

一、为什么需要文档型数据库?

1.1 数据存储的范式变革

在移动互联网与物联网时代,‌非结构化数据占比超过80%‌(IDC报告)。传统关系型数据库(如MySQL)的固定表结构难以应对以下场景:

  • ‌动态字段需求‌:用户画像标签频繁增减
  • ‌海量数据写入‌:物联网设备每秒万级数据写入
  • ‌复杂嵌套结构‌:一篇电商商品信息包含多级评论、规格参数

‌MongoDB作为文档型数据库的代表‌,采用BSON(Binary JSON)格式存储数据,支持动态模式、水平扩展和地理空间查询,成为大数据场景的核心基础设施。

1.2 pymongo的核心优势

作为MongoDB官方Python驱动,pymongo提供:

  • ‌原生BSON支持‌:无缝处理Python字典与BSON的转换
  • ‌连接池管理‌:自动管理TCP连接复用
  • ‌聚合管道封装‌:支持复杂数据分析操作
  • ‌完善的API‌:覆盖索引管理、副本集操作等高级功能

二、pymongo核心操作全解析

2.1 环境准备
# 安装MongoDB社区版(以Ubuntu为例)
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update
sudo apt-get install -y mongodb-org# 安装pymongo
pip install pymongo
2.2 数据库连接与CRUD操作
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure# 建立连接(默认连接池大小100)
client = MongoClient(host="localhost",port=27017,username="admin",  # 启用身份验证时必填password="securepassword",authSource="admin"
)try:# 心跳检测client.admin.command('ping')print("Successfully connected to MongoDB!")
except ConnectionFailure:print("Server not available")# 选择数据库与集合(自动懒创建)
db = client["ecommerce"]
products_col = db["products"]# 插入文档(自动生成_id)
product_data = {"name": "Wireless Mouse","price": 49.99,"tags": ["electronics", "computer"],"stock": {"warehouse_A": 100, "warehouse_B": 50},"last_modified": datetime.now()
}
insert_result = products_col.insert_one(product_data)
print(f"Inserted ID: {insert_result.inserted_id}")# 查询文档(支持嵌套查询)
query = {"price": {"$lt": 60}, "tags": "electronics"}
projection = {"name": 1, "price": 1}  # 类似SQL SELECT
cursor = products_col.find(query, projection).limit(5)
for doc in cursor:print(doc)# 更新文档(原子操作)
update_filter = {"name": "Wireless Mouse"}
update_data = {"$inc": {"stock.warehouse_A": -10}, "$set": {"last_modified": datetime.now()}}
update_result = products_col.update_one(update_filter, update_data)
print(f"Modified count: {update_result.modified_count}")# 删除文档
delete_result = products_col.delete_many({"price": {"$gt": 200}})
print(f"Deleted count: {delete_result.deleted_count}")
2.3 聚合管道实战
# 统计各仓库库存总量
pipeline = [{"$unwind": "$stock"},  # 展开嵌套文档{"$group": {"_id": "$stock.warehouse","total_stock": {"$sum": "$stock.quantity"}}},{"$sort": {"total_stock": -1}}
]
results = products_col.aggregate(pipeline)
for res in results:print(f"Warehouse {res['_id']}: {res['total_stock']} units")
2.4 分批次插入百万级数据(进阶)
from pymongo import MongoClient
from faker import Faker
import timeclient = MongoClient('mongodb://localhost:27017/')
db = client['bigdata']
collection = db['user_profiles']fake = Faker()
batch_size = 5000  # 分批次插入减少内存压力def generate_batch(batch_size):return [{"name": fake.name(),"email": fake.email(),"last_login": fake.date_time_this_year()} for _ in range(batch_size)]start_time = time.time()
for _ in range(200):  # 总数据量100万batch_data = generate_batch(batch_size)collection.insert_many(batch_data, ordered=False)  # 无序插入提升速度print(f"已插入 {(i+1)*batch_size} 条数据")print(f"总耗时: {time.time()-start_time:.2f}秒") 
2.5 分批次插入百万级数据(进阶)
# 分析电商订单数据(含嵌套结构)
pipeline = [{"$unwind": "$items"},  # 展开订单中的商品数组{"$match": {"status": "completed"}},  # 筛选已完成订单{"$group": {"_id": "$items.category","total_sales": {"$sum": "$items.price"},"avg_quantity": {"$avg": "$items.quantity"},"top_product": {"$max": "$items.name"}}},{"$sort": {"total_sales": -1}},{"$limit": 10}
]orders_col = db["orders"]
results = orders_col.aggregate(pipeline)for res in results:print(f"品类 {res['_id']}: 销售额{res['total_sales']}元")

三、生产环境进阶配置

3.1 性能优化关键措施
# 创建索引(提升查询速度)
products_col.create_index([("name", pymongo.ASCENDING)], unique=True)
products_col.create_index([("price", pymongo.ASCENDING), ("tags", pymongo.ASCENDING)])# 批量写入提升吞吐量
bulk_ops = [pymongo.InsertOne({"name": "Keyboard", "price": 89.99}),pymongo.UpdateOne({"name": "Mouse"}, {"$set": {"price": 59.99}}),pymongo.DeleteOne({"name": "Earphones"})
]
results = products_col.bulk_write(bulk_ops)
3.2 高可用架构配置
# MongoDB副本集配置(3节点)
replication:replSetName: "rs0"members:- _id: 0, host: "mongo1:27017"- _id: 1, host: "mongo2:27017"- _id: 2, host: "mongo3:27017", arbiterOnly: true
3.3 安全加固方案
# 启用身份验证
use admin
db.createUser({user: "admin",pwd: "securepassword",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})# 配置网络加密
net:tls:mode: requireTLScertificateKeyFile: /etc/ssl/mongo.pem

四、总结与最佳实践

4.1 技术选型对比‌:
特性MongoDBMySQL
数据模型动态文档固定表结构
扩展方式水平分片垂直扩展
事务支持4.0+版本支持原生完善支持
适用场景日志/用户行为数据金融交易系统
4.2 性能优化原则‌:
  1. ‌Working Set‌原则:确保常用数据能放入内存
  2. ‌索引覆盖‌:通过组合索引避免回表查询
  3. ‌分片键设计‌:选择高基数、易分散的字段
4‌.3 避坑指南‌:
  • 避免文档无限制增长(推荐设置capped collection)
  • 慎用$where操作符(导致全表扫描)
  • 生产环境必须配置副本集与定期备份
Python爬虫相关文章(推荐)
Python爬虫介绍Python爬虫(1)Python爬虫:从原理到实战,一文掌握数据采集核心技术
HTTP协议解析Python爬虫(2)Python爬虫入门:从HTTP协议解析到豆瓣电影数据抓取实战
HTML核心技巧Python爬虫(3)HTML核心技巧:从零掌握class与id选择器,精准定位网页元素
CSS核心机制Python爬虫(4)CSS核心机制:全面解析选择器分类、用法与实战应用
静态页面抓取实战Python爬虫(5)静态页面抓取实战:requests库请求头配置与反反爬策略详解
静态页面解析实战Python爬虫(6)静态页面解析实战:BeautifulSoup与lxml(XPath)高效提取数据指南
Python数据存储实战 CSV文件Python爬虫(7)Python数据存储实战:CSV文件读写与复杂数据处理指南
Python数据存储实战 JSON文件Python爬虫(8)Python数据存储实战:JSON文件读写与复杂结构化数据处理指南
Python数据存储实战 MySQL数据库Python爬虫(9)Python数据存储实战:基于pymysql的MySQL数据库操作详解

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

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

相关文章

Springboot 手搓 后端 滑块验证码生成

目录 一、效果演示 二、后端滑块验证码生成思路 三、原理解析 四、核心代码拿走 滑块验证码react前端实现,见我的这篇博客:前端 React 弹窗式 滑动验证码实现_react中使用阿里云滑块验证码2.0前端接入及相关视觉-CSDN博客 一、效果演示 生成的案例…

关于flink两阶段提交高并发下程序卡住问题

先抛出代码 package com.dpf.flink;import com.dpf.flink.sink.MysqlSink; import org.apache.flink.api.common.serialization.SimpleStringSchema; import org.apache.flink.api.common.typeinfo.Types; import org.apache.flink.api.java.tuple.Tuple2; import org.apache.…

html css js网页制作成品——HTML+CSS+js美甲店网页设计(5页)附源码

美甲店 目录 一、👨‍🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨‍&a…

LeetCode[347]前K个高频元素

思路: 使用小顶堆,最小的元素都出去了,省的就是大,高频的元素了,所以要维护一个小顶堆,使用map存元素高频变化,map存堆里,然后输出堆的东西就行了 代码: class Solution…

2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型?

2024年网站开发语言选择指南:PHP/Java/Node.js/Python如何选型? 一、8大主流Web开发语言技术对比 1. PHP开发:中小型网站的首选方案 最新版本:PHP 8.3(2023年11月发布)核心优势: 全球78%的网站…

从数据结构说起(一)

1 揭开数据结构神奇的面纱 1.1 初识数据结构 在C的标准库模板(Standard Template Library,STL)课程上,我初次结识了《数据结构》。C语言提供的标准库模板是面向对象程序设计与泛型程序设计思想相结合的典范。所谓的泛型编程就是编写不依赖于具…

JAVA--- 关键字static

之前我们学习了JAVA 面向对象的一些基本知识,今天来进阶一下!!! static关键字 static表示静态,是JAVA中的一个修饰符,可以修饰成员方法,成员变量,可用于修饰类的成员(变…

4.27比赛总结

文章目录 T1T2法一:倍增求 LCA法二:Dijkstra 求最短路法三:dfs 求深度 T3T4总结 T1 一道非常简单的题,结果我因为一句话没写挂了 80pts…… 题目中没写 a a a 数组要按照 b b b 数组的顺序,所以对于最大方案&#x…

数据一致性巡检总结:基于分桶采样的设计与实现

数据一致性巡检总结:基于分桶采样的设计与实现 背景 在分布式系统中,缓存(如 Redis)与数据库(如 MySQL)之间的数据一致性问题是一个常见的挑战。由于缓存的引入,数据在缓存和数据库之间可能存…

SpringBoot与Druid整合,实现主从数据库同步

通过引入主从数据库同步系统,可以显著提升平台的性能和稳定性,同时保证数据的一致性和安全性。Druid连接池也提供了强大的监控和安全防护功能,使得整个系统更加健壮和可靠。 我们为什么选择Druid? 高效的连接管理:Dru…

在Linux系统中安装MySQL,二进制包版

1、检查是否已安装数据库(rpm软件包管理器) rpm -qa | grep mysql rpm -qa | grep mariadb #centOS7自带mariadb与mysql数据库冲突2、删除已有数据库 rpm -e –nodeps 软件名称 3、官网下载MySQL包 4、上传 # 使用FinalShell或Xshell工具上传&#…

【含文档+PPT+源码】基于SpringBoot电脑DIY装机教程网站的设计与实现

项目介绍 本课程演示的是一款 基于SpringBoot电脑DIY装机教程网站的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套…

Spring Boot 缓存机制:从原理到实践

文章目录 一、引言二、Spring Boot 缓存机制原理2.1 缓存抽象层2.2 缓存注解2.3 缓存管理器 三、入门使用3.1 引入依赖3.2 配置缓存3.3 启用缓存3.4 使用缓存注解3.5 实体类 四、踩坑记录4.1 缓存键生成问题4.2 缓存过期与更新问题4.3 事务与缓存的一致性问题 五、心得体会5.1 …

Spark读取Apollo配置

--conf spark.driver.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 --conf spark.executor.extraJavaOptions-Dapp.idapollo的app.id -Denvfat -Dapollo.clusterfat -Dfat_metaapollo的meta地址 在spark的提交命令中&…

[逆向工程]如何理解小端序?逆向工程中的字节序陷阱与实战解析

[逆向工程]如何理解小端序?逆向工程中的字节序陷阱与实战解析 关键词:逆向工程、小端序、字节序、二进制分析、数据解析 引言:为什么字节序是逆向工程师的必修课? 在逆向工程中,分析二进制数据是最基础的任务之一。…

项目三 - 任务2:创建笔记本电脑类(一爹多叔)

在本次实战中,我们通过Java的单根继承和多接口实现特性,设计了一个笔记本电脑类。首先创建了Computer抽象类,提供计算的抽象方法,模拟电脑的基本功能。接着定义了NetCard和USB两个接口,分别包含连接网络和USB设备的抽象…

ElasticSearch深入解析(六):集群核心配置

1.开发模式和生产模式 Elasticsearch默认运行在开发模式下,此模式允许节点在配置存在错误时照常启动,仅将警告信息写入日志文件。而生产模式则更为严格,一旦检测到配置错误,节点将无法启动,这是一种保障系统稳定性的安…

【Prometheus-MySQL Exporter安装配置指南,开机自启】

目录 1. 创建 MySQL 监控用户2. 配置 MySQL 认证文件3. 安装 mysqld_exporter4. 配置 Systemd 服务5. 启动并验证服务6. 修改Prometheus配置常见错误排查错误现象排查步骤 6. 验证监控数据关键注意事项 7. Grafana看板 1. 创建 MySQL 监控用户 mysql -uroot -p123456 # 登录M…

redis未授权访问漏洞学习

一、Redis常见用途 1. Redis介绍 全称与起源: Redis全称Remote Dictionary Service(远程字典服务),最初由antirez在2009年开发,用于解决网站访问记录统计的性能问题。发展历程: 从最初仅支持列表功能的内存数据库,经过十余年发展已支持多种…

4.27搭建用户界面

更新 router下面的index.js添加新的children 先区分一下views文件夹下的不同vue文件: Home.vue是绘制home页面的所有的表格。 Main.vue是架构头部和左侧目录的框架的。 研究一下这个routes对象,就可以发现重定向redirect的奥妙所在,我们先把…