爬蟲數據存儲:Redis、MySQL 與 MongoDB 的對比與實踐

爬蟲的核心任務是從網絡中提取數據,而存儲這些數據是流程中不可或缺的一環。根據業務需求的不同,存儲的選擇可能直接影響數據處理的效率和開發體驗。本文將介紹三種常用的存儲工具——Redis、MySQL 和 MongoDB,分析它們的特點,并提供相關的入庫示例代碼。


一、數據庫選型分析
  1. Redis

    • 特點:內存數據庫,速度極快,支持多種數據結構(如字符串、哈希表、列表、集合等)。

    • 適用場景:適合臨時數據緩存、去重、任務隊列等場景。

    • 優點:高性能、簡單易用。

    • 缺點:數據量大時成本高(內存占用)。

  2. MySQL

    • 特點:關系型數據庫,結構化存儲,支持 SQL 查詢。

    • 適用場景:需要復雜查詢、事務支持的場景。

    • 優點:穩定成熟、生態完善。

    • 缺點:對頻繁寫入操作性能稍弱。

  3. MongoDB

    • 特點:非關系型數據庫,文檔存儲模式(JSON 格式),靈活性高。

    • 適用場景:非結構化或半結構化數據存儲,數據模型多變的場景。

    • 優點:易擴展、查詢靈活。

    • 缺點:事務支持較弱,復雜查詢性能略遜于 MySQL。


二、示例代碼:存儲爬取數據

我們以一個模擬的數據樣例為例,展示如何分別將數據存儲到 Redis、MySQL 和 MongoDB 中。

數據樣例
data = {"id": 1,"title": "爬蟲數據存儲:Redis、MySQL 與 MongoDB 的對比與實踐","author": "CSDN-MySheep","url": "https://blog.csdn.net/m0_60082046/article/details/144704817"
}
1. Redis 存儲
import redis# 連接 Redis
redis_client = redis.StrictRedis(host='localhost', port=6379, db=0)# 將數據存入 Redis
redis_client.hset(f"article:{data['id']}", mapping=data)# 驗證存儲結果
stored_data = redis_client.hgetall(f"article:{data['id']}")
print(f"Redis 存儲結果:{stored_data}")
2. MySQL 存儲
import pymysql# 連接 MySQL
connection = pymysql.connect(host='localhost', user='root', password='password', database='crawler_db')
cursor = connection.cursor()# 創建表(如果不存在)
cursor.execute("""
CREATE TABLE IF NOT EXISTS articles (id INT PRIMARY KEY,title VARCHAR(255),author VARCHAR(50),url VARCHAR(255)
)
""")# 插入數據
sql = "INSERT INTO articles (id, title, author, url) VALUES (%s, %s, %s, %s)"
cursor.execute(sql, (data['id'], data['title'], data['author'], data['url']))# 提交事務
connection.commit()
print(f"MySQL 存儲完成:ID {data['id']}")# 關閉連接
cursor.close()
connection.close()
3. MongoDB 存儲
from pymongo import MongoClient# 連接 MongoDB
mongo_client = MongoClient("mongodb://localhost:27017/")
db = mongo_client["crawler_db"]
collection = db["articles"]# 插入數據
collection.insert_one(data)
print(f"MongoDB 存儲完成:{data}")

三、Redis、MySQL 和 MongoDB 的對比
特性RedisMySQLMongoDB
類型內存數據庫關系型數據庫非關系型數據庫
性能較高
存儲格式Key-Value表格(行、列)文檔(JSON 格式)
查詢支持簡單查詢強大的 SQL 支持靈活的文檔查詢
事務支持基礎事務支持完備的事務支持有限的事務支持
適用場景緩存、任務隊列復雜查詢、結構化存儲半結構化/非結構化存儲

四、選擇建議
  1. 如果需要高速緩存和簡單存儲:選擇 Redis。

    • 適合存儲爬取任務隊列、去重記錄等。

    • 在企業等工作中也會常用到Redis,因為入庫是和采集是分開的,一般會使用Redis作為中間層,爬蟲將數據推入Redis隊列,負責入庫的程序會讀取數據進一步進行數據處理再轉為結構化數據入庫,例如外文翻譯為中文,情感打分等。

  2. 如果數據有固定結構,需要復雜查詢:選擇 MySQL。

    • 適合存儲文章、用戶信息等結構化數據。

  3. 如果數據格式靈活多變:選擇 MongoDB。

    • 適合爬取社交媒體、日志數據等非結構化內容。


五、總結

在爬蟲開發中,選擇合適的數據庫存儲工具能夠大幅提升數據處理的效率和開發體驗。Redis 的高性能緩存、MySQL 的結構化支持、MongoDB 的靈活性,各有千秋。根據項目需求合理選擇存儲方案,能夠讓你的爬蟲更高效、更穩定。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64267.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64267.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64267.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Python】使用匿名函數Lambda解析html源碼的任意元素(Seleinium ,BeautifulSoup皆適用)

一直都發現lambda函數非常好用,它可以用簡潔的方式編寫小函數,無需寫冗長的過程就可以獲取結果。干脆利落! 它允許我們定義一個匿名函數,在調用一次性的函數時非常有用。 最近整理了一些,lambda函數結合BeautifulSou…

Bash語言的語法

Bash語言簡介與應用 Bash(Bourne Again SHell)是一種Unix Shell和命令語言,在Linux、macOS及其他類Unix系統中被廣泛使用。作為GNU項目的一部分,Bash不僅是對早期Bourne Shell的增強,還引入了許多特性和功能&#xff…

Ingress-Nginx Annotations 指南:配置要點全方面解讀(下)

文章目錄 1.HTTP2 Push Preload2.Server Alias3.Server snippet4.Client Body Buffer Size5.External Authentication6.Global External Authentication7.Rate Limiting8.Global Rate Limiting9.Permanent Redirect10.Permanent Redirect Code11.Temporal Redirect12.SSL Passt…

互聯網路由架構

大家覺得有意義和幫助記得及時關注和點贊!!! 本書致力于解決實際問題,書中包含大量的架構圖、拓撲圖和真實場景示例,內容全面 且易于上手,是不可多得的良心之作。本書目的是使讀者成為將自有網絡集成到全球互聯網 領域的專家。 以下是筆記內…

【Flutter_Web】Flutter編譯Web第三篇(網絡請求篇):dio如何改造方法,變成web之后數據如何處理

前言 Flutter端在處理網絡請求的時候,最常用的庫當然是Dio了,那么在改造成web端的時候,最先處理的必然是網絡請求,否則沒有數據去處理驅動實圖渲染。 官方鏈接 pub https://pub.dev/packages/diogithub https://github.com/c…

Spring Boot @Conditional注解

在Spring Boot中,Conditional 注解用于條件性地注冊bean。這意味著它可以根據某些條件來決定是否應該創建一個特定的bean。這個注解可以放在配置類或方法上,并且它會根據提供的一組條件來判斷是否應該實例化對應的組件。 要使用 Conditional注解時&#…

項目上傳到gitcode

首先需要在個人設置里面找到令牌 記住自己的賬號和訪問令牌(一長串),后面git要輸入這個, 賬號是下面這個 來到自己的倉庫 #查看遠程倉庫,是不是自己的云倉庫 git remote -v # 創建新分支 git checkout -b llf # 三步…

【Rust自學】6.4. 簡單的控制流-if let

喜歡的話別忘了點贊、收藏加關注哦,對接下來的教程有興趣的可以關注專欄。謝謝喵!(・ω・) 6.4.1. 什么是if let if let語法允許將if和let組合成一種不太冗長的方式來處理與一種模式匹配的值,同時忽略其余模式。 可以…

【Git學習】windows系統下git init后沒有看到生成的.git文件夾

[問題] git init 命令后看不到.git文件夾 [原因] 文件夾設置隱藏 [解決辦法] Win11 win10

vscode添加全局宏定義

利用vscode編輯代碼時,設置了禁用非活動區域著色后,在一些編譯腳本中配置的宏又識別不了 遇到#ifdef包住的代碼就會變暗色,想查看代碼不是很方便。如下圖: 一 解決: 在vscode中添加全局宏定義。 二 步驟&#xff1a…

【服務器主板】定制化:基于Intel至強平臺的全新解決方案

隨著數據處理需求不斷增長,服務器硬件的發展也在持續推進。在這一背景下,為用戶定制了一款全新的基于Intel至強平臺的服務器主板,旨在提供強大的計算能力、優異的內存支持以及高速存儲擴展能力。適用于需要高性能計算、大規模數據處理和高可用…

php怎么去除數點后面的0

在PHP中,我們可以使用幾種方法來去除數字小數點后的0。 方法一:使用intval函數 intval函數可以將一個數字轉化為整數,另外,它也可以去除小數點后面的0。 “php $number 123.4500; $number intval($number); echo $number; // 輸…

數字后端培訓項目Floorplan常見問題系列專題續集1

今天繼續給大家分享下數字IC后端設計實現floorplan階段常見問題系列專題。這些問題都是來自于咱們社區IC后端訓練營學員提問的問題庫。目前這部分問題庫已經積累了4年了,后面會陸續分享這方面的問題。 希望對大家的數字后端學習和工作有所幫助。 數字后端項目Floor…

【遞歸,搜索與回溯算法 綜合練習】深入理解暴搜決策樹:遞歸,搜索與回溯算法綜合小專題(二)

優美的排列 題目解析 算法原理 解法 :暴搜 決策樹 紅色剪枝:用于剪去該節點的值在對應分支中,已經被使用的情況,可以定義一個 check[ ] 紫色剪枝:perm[i] 不能夠被 i 整除,i 不能夠被 per…

Java中各種數組復制方式的效率對比

在 Java 中,數組復制是一個常見的操作,尤其是在處理動態數組(如 ArrayList)時。Java 提供了多種數組復制的方式,每種方式在性能和使用場景上都有所不同。以下是對幾種主要數組復制方式的比較,包括 System.a…

視頻會議是如何實現屏幕標注功能的?

現在主流的視頻會議軟件都有屏幕標注功能,屏幕標注功能給屏幕分享者講解分享內容時提供了極大的方便。那我們以傲瑞視頻會議(OrayMeeting)為例,來講解屏幕標注是如何實現的。 傲瑞會議的PC端(Windows、信創Linux、銀河…

Framework開發入門(一)之源碼下載

一、使用Linux操作系統的小伙伴可以跳轉到官網鏈接按提示操作 官網源碼地址:下載源代碼 | Android Open Source Project 1.創建一個空目錄來存放您的工作文件。為其指定一個您喜歡的任意名稱: mkdir WORKING_DIRECTORYcdWORKING_DIRECTORY …

改進爬山算法之四:概率爬山法(Probabilistic Hill Climbing,PHC)

概率爬山法(Probabilistic Hill Climbing,PHC)是一種局部搜索算法,它結合了隨機性和貪婪搜索的特點,是對爬山算法(Hill Climbing Algorithm)的一種變體或擴展。與傳統的爬山法不同,PHC不是總是選擇最優的鄰居作為下一步的移動,而是以一定的概率選擇最優鄰居,同時以一…

Unity中實現人物殘影效果

今天火柴人聯盟3公測了,看到一個殘影的效果,很有意思,上網查詢了一下實現方式, 實現思路: 將角色的網格復制出來,然后放置到新建的物體的MeshFilter組件上,每隔幾十毫秒在玩家的位置生成一個&a…

C#實現調用DLL 套殼讀卡程序(桌面程序開發)

背景 正常業務已經支持 讀三代卡了,前端調用醫保封裝好的服務就可以了,但是長護要讀卡,就需要去訪問萬達,他們又搞了一套讀卡的動態庫,為了能夠掉萬達的接口,就需要去想辦法調用它們提供的動態庫方法&…