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.pswp.cn/web/77802.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/77802.shtml
英文地址,請注明出處:http://en.pswp.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的奧妙所在,我們先把…