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 技术选型对比:
特性 | MongoDB | MySQL |
---|---|---|
数据模型 | 动态文档 | 固定表结构 |
扩展方式 | 水平分片 | 垂直扩展 |
事务支持 | 4.0+版本支持 | 原生完善支持 |
适用场景 | 日志/用户行为数据 | 金融交易系统 |
4.2 性能优化原则:
- Working Set原则:确保常用数据能放入内存
- 索引覆盖:通过组合索引避免回表查询
- 分片键设计:选择高基数、易分散的字段
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数据库操作详解 |
相关文章:
Python爬虫(10)Python数据存储实战:基于pymongo的MongoDB开发深度指南
目录 一、为什么需要文档型数据库?1.1 数据存储的范式变革1.2 pymongo的核心优势 二、pymongo核心操作全解析2.1 环境准备2.2 数据库连接与CRUD操作2.3 聚合管道实战2.4 分批次插入百万级数据(进阶)2.5 分批次插入百万级数据(进阶…...

大模型「瘦身」指南:从LLaMA到MobileBERT的轻量化部署实战
大模型「瘦身」指南:从LLaMA到MobileBERT的轻量化部署实战 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 大模型「瘦身」指南:从LLaMA到MobileBERT的轻量化部署实战摘要引言一、轻量化技术…...

从逻辑视角学习信息论:概念框架与实践指南
文章目录 一、信息论的逻辑基础与哲学内涵1.1 信息的逻辑本质:区分与差异1.2 逆范围原理与信息内容 二、信息论与逻辑学的概念交汇2.1 熵作为逻辑不确定性的度量2.2 互信息与逻辑依赖2.3 信道容量的逻辑极限 三、信息论的核心原理与逻辑基础3.1 最大熵原理的逻辑正当…...
springboot配置mysql druid连接池,以及连接池参数解释
文章目录 前置配置方式参数解释 前置 springboot 项目javamysqldruid 连接池 配置方式 在 springboot 的 application.yml 中配置基本方式 # Druid 配置(Spring Boot YAML 格式) spring:datasource:url: jdbc:mysql://localhost:3306/testdb?useSSL…...
Spring Boot集成Resilience4j实现微服务容错机制
在Spring Boot中集成Resilience4j实现微服务容错 引言 在微服务架构中,服务之间的调用不可避免,但由于网络延迟、服务不可用等问题,调用失败的情况时有发生。为了提高系统的稳定性和可用性,我们需要引入容错机制。Resilience4j是…...
(一) 本地hadoop虚拟机系统设置
1.配置固定IP地址(每一台都配置) 开启node1,修改主机名为node1,并修改固定IP为:192.168.88.131 # 修改主机名 hostnamectl set-hostname node1# 修改IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 IPADDR"…...

TDengine 运维—容量规划
概述 若计划使用 TDengine 搭建一个时序数据平台,须提前对计算资源、存储资源和网络资源进行详细规划,以确保满足业务场景的需求。通常 TDengine 会运行多个进程,包括 taosd、taosadapter、taoskeeper、taos-explorer 和 taosx。 在这些进程…...
【MySQL成神之路】MySQL索引相关介绍
1 相关理论介绍 一、索引基础概念 二、索引类型 1. 按数据结构分类 2. 按功能分类 三、索引数据结构原理 B树索引特点: 哈希索引特点: 四、索引使用原则 1. 创建索引原则 2. 避免索引失效情况 五、索引优化策略 六、索引维护与管理 七、特殊…...

PPP 拨号失败:ATD*99***1# ... failed
从日志来看,主要有两类问题: 一、led_indicator_stop 报 invalid p_handle E (5750) led_indicator: …/led_indicator.c:461 (led_indicator_stop):invalid p_handle原因分析 led_indicator_stop() 的参数 p_handle (即之前 led_indicator…...
PostgreSQL跨数据库表字段值复制实战经验分
场景需求 在实际工作中,我们经常需要将一个PostgreSQL数据库中的表字段值复制到另一个数据库中。最近我在处理两个ERP系统数据库(A库和B库)之间的数据同步时,就遇到了这样的需求:需要将B库中sale_order表的合同信息&a…...

【计网】五六章习题测试
目录 1. (单选题, 3 分)某个网络所分配到的地址块为172.16.0.0/29,能接收目的地址为172.16.0.7的IP分组的最大主机数是( )。 2. (单选题, 3 分)若将某个“/19”的CIDR地址块划分为7个子块,则可能的最小子块中的可分配IP地址数量…...
汇川EasyPLC MODBUS-RTU通信配置和编程实现
累积流量计算(MODBUS RTU通信数据处理)数据处理相关内容。 累积流量计算(MODBUS RTU通信数据处理)_流量积算仪modbus rtu通讯-CSDN博客文章浏览阅读219次。1、常用通信数据处理MODBUS通信系列之数据处理_modbus模拟的数据变化后会在原来的基础上累加是为什么-CSDN博客MODBUS通…...

从 CANopen到 PROFINET:网关助力物流中心实现复杂的自动化升级
使用 CANopen PLC 扩展改造物流中心的传送带 倍讯科技profinet转CANopen网关BX-601-EIP将新的 PROFINET PLC 系统与旧的基于 CANopen 的传送带连接起来,简化了物流中心的自动化升级。 新建还是升级?这些问题通常出现在复杂的内部物流设施中,…...

基于Yolov8+PyQT的老人摔倒识别系统源码
概述 基于Yolov8PyQT的老人摔倒识别系统,该系统通过深度学习算法实时检测人体姿态,精准识别站立、摔倒中等3种状态,为家庭或养老机构提供及时预警功能。 主要内容 完整可运行代码 项目采用Yolov8目标检测框架结合PyQT5开发…...

wsl2 不能联网
wsl2 安装后用 wifi 共享是能联网,问题出在公司网络限制 wsl2 IP 访问网络,但是主机可以上网。 解决办法,在主机用 nginx 设置代理,可能需要开端口权限 server {listen 9000;server_name localhost;location /ubuntu/ {#…...
双击重复请求的方法
1、限制点击次数 2、vue中 可以自定义一个属性指令 preventReClick.js中定义: import Vue from vue Vue.directive(preventReClick, {inserted: (el, binding) > {el.addEventListener(click, () > {if (!el.disabled) {el.disabled truesetTimeout(() >…...

Java[IDEA]里的debug
目录 前言 Debug 使用Debug 总结 前言 这里我说一下就是 java IDEA 工具里的debug工具 里的一个小问题 就是 当我们使用debug去查看内部文档 查看不到 是为什么 Debug 所谓 debug 工具 他就是用来调试程序的 当我们写代码 报错 出错时 我们就可以使用这个工具 因此这个工具…...
一条SQL语句的旅程:解析、优化与执行全过程研究
1、引言 在现代信息系统中,数据库是核心组件之一。SQL(结构化查询语言)作为与数据库交互的主要方式,其执行效率直接影响到整个系统的性能表现。虽然开发者常常只需编写一行简单的 SQL,但数据库内部却经历了一个复杂而精密的过程来完成这条 SQL 的处理。 本文将以一个完整…...
动态规划经典三题_完全平方数
279. 完全平方数 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而…...
LVGL(lv_textarea文本框控件)
文章目录 一、lv_textarea 是什么?二、基本用法1. 创建 lv_textarea 对象2. 设置提示文字(占位符)3. 设置最大长度4. 设置密码模式(显示为\*号)5. 获取和设置内容6. 配合虚拟键盘使用(常用于触摸屏…...
蓝桥杯国14 互质
问题描述 请计算在 [1,2023的2023次幂] 范围内有多少个整数与 2023 互质。由于结果可能很大,你只需要输出对 1097 取模之后的结果。 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个…...

DAO模式
1. 持久化 简单来说,就是把代码的处理结果转换成需要的格式进行储存。 2. JDBC的封装 3. DAO模式 4. Properties类与Properties配置文件 添加 读取 5. 使用实体类传递数据 6. 总结 附录: BaseDao指南 BaseDao指南-CSDN博客...

ECharts图表工厂,完整代码+思路逻辑
Echart工厂支持柱状图(bar)折线图(line)散点图(scatter)饼图(pie)雷达图(radar)极坐标柱状图(polarBar)和极坐标折线图(po…...
Logback 在 Spring Boot 中的详细配置
1. Logback 配置文件 Spring Boot 默认会加载 classpath 下的 logback-spring.xml(推荐)或 logback.xml 作为 Logback 的配置文件。 推荐使用 logback-spring.xml,因为 Spring Boot 提供了扩展支持(例如基于 Profile 的配置&am…...
写起来比较复杂的深搜题目
年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置。 那个装置太旧了,以至于只能发射关于那辆车的移动路线的方向信息。 编写程序,通过使用一张小镇的地图…...
MySQL强化关键_016_存储引擎
目 录 一、概述 二、MySQL 支持的存储引擎 三、指定存储引擎 四、修改存储引擎 五、常用存储引擎及适用场景 一、概述 MySQL 存储引擎决定了数据在磁盘上的存储方式和访问方式;不同的存储引擎实现了不同的存储和检索算法;MySQL 常见的存储引擎&…...

CSS:margin的塌陷与合并问题
文章目录 一、margin塌陷问题二、margin合并问题 一、margin塌陷问题 二、margin合并问题...
防护等级IPxx含义 -雨天充电需要防护盖吗
指标快要到期,新买的电车,第一次碰到雨天充电的问题,有点担心漏电。然后电商平台上一查,果然有卖防护罩的,但是真的需要吗? 下面从充电口防护等级,国标要求、注意事项等几个方面分析。 一、防护…...
【设计模式】责任链+模板+工程模式使用模板
前言 方便写出优雅,解耦,高内聚,高复用的代码。 Demo // 1. 定义验证器接口(责任链模式) public interface Validator {Validator setNext(Validator next);boolean validate(Data data); }// 2. 创建抽象验证器&am…...

探索服务网格(Service Mesh):云原生时代的网络新范式
文章目录 一、引言二、什么是服务网格基本定义形象比喻 三、服务网格解决了哪些问题微服务通信复杂性可观察性安全性 四、常见的服务网格实现IstioLinkerdConsul Connect 五、服务网格的应用场景大型微服务架构混合云环境 六、服务网格的未来发展与其他技术的融合标准化和行业规…...