爬虫数据存储: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.mzph.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 套壳读卡程序(桌面程序开发)

背景 正常业务已经支持 读三代卡了,前端调用医保封装好的服务就可以了,但是长护要读卡,就需要去访问万达,他们又搞了一套读卡的动态库,为了能够掉万达的接口,就需要去想办法调用它们提供的动态库方法&…