【0基础学爬虫】爬虫基础之数据存储
字数 1560 2025-08-11 08:36:24
爬虫基础之数据存储:MySQL、MongoDB与Redis详解
概述
在爬虫开发中,数据存储是至关重要的环节。本文将详细介绍三种流行的数据库存储技术:MySQL(关系型数据库)、MongoDB(文档型数据库)和Redis(内存数据库),包括它们的优缺点、适用场景以及Python操作方式。
一、MySQL关系型数据库
1. MySQL简介
MySQL是一种开源的关系型数据库管理系统(RDBMS),特点包括:
- 使用SQL(结构化查询语言)作为查询和管理语言
- 支持事务处理,保证数据一致性
- 具有高度的灵活性和可扩展性
- 广泛应用于Web开发、数据分析和数据存储领域
2. 安装与配置
- 从MySQL官网下载对应版本安装
- 安装Python操作MySQL的库:
pip install pymysql
3. SQL基础语法
数据库操作
-- 创建数据库
CREATE DATABASE 数据库名;
-- 查看所有数据库
SHOW DATABASES;
-- 使用数据库
USE 数据库名;
-- 删除数据库
DROP DATABASE 数据库名;
表操作
-- 创建表
CREATE TABLE 表名(
属性名 数据类型 约束,
...
);
-- 查看表结构
DESC 表名;
-- 修改表名
ALTER TABLE 表名 RENAME TO 新表名;
-- 添加字段
ALTER TABLE 表名 ADD 属性名 数据类型 约束;
-- 删除字段
ALTER TABLE 表名 DROP 属性名;
-- 删除表
DROP TABLE 表名;
常用约束
| 约束 | 描述 |
|---|---|
| PRIMARY KEY | 主键约束,唯一标识 |
| UNIQUE | 唯一约束 |
| NOT NULL | 非空约束 |
| FOREIGN KEY | 外键约束 |
| AUTO_INCREMENT | 自增 |
| DEFAULT | 默认值 |
数据操作
-- 插入数据
INSERT INTO 表名(属性1, 属性2) VALUES(值1, 值2);
-- 更新数据
UPDATE 表名 SET 属性1=值1 WHERE 条件;
-- 删除数据
DELETE FROM 表名 WHERE 条件;
-- 查询数据
SELECT 字段1,字段2 FROM 表名 WHERE 条件;
4. Python操作MySQL
连接数据库
import pymysql
db = pymysql.connect(
host='localhost',
user='root',
database='user',
password='test123',
port=3306,
charset='utf8mb4'
)
cursor = db.cursor() # 获取操作游标
创建表
sql = 'CREATE TABLE students (id VARCHAR(255) PRIMARY KEY, name VARCHAR(255) NOT NULL, age INT NOT NULL, grade INT)'
cursor.execute(sql)
db.close()
插入数据
sql = 'INSERT INTO students(id, name, age, grade) values ("%(id)s", "%(name)s", %(age)d, %(grade)d)'
try:
cursor.execute(sql % {'id': '1001', 'name': '张三', 'age': 25, 'grade': 92})
db.commit() # 提交事务
except:
db.rollback() # 回滚
db.close()
查询数据
sql = "SELECT * FROM students WHERE age > 20"
cursor.execute(sql)
result = cursor.fetchall() # 获取所有结果
print(result)
二、MongoDB文档型数据库
1. MongoDB简介
MongoDB是非关系型数据库(NoSQL),特点包括:
- 文档存储格式类似JSON
- 无固定表结构,适合半结构化数据
- 高性能,适合处理大规模数据集
- 不支持事务,不适合需要强一致性的场景
2. 安装与配置
- 从MongoDB官网下载安装
- 安装Python操作库:
pip install pymongo
3. MongoDB基础命令
// 查看当前数据库
db
// 查看所有数据库
show dbs
// 切换/创建数据库
use 数据库名
// 删除数据库
db.dropDatabase()
// 创建集合(类似表)
db.createCollection('集合名')
// 查看集合
show collections
// 删除集合
db.集合名.drop()
4. Python操作MongoDB
连接数据库
import pymongo
client = pymongo.MongoClient('mongodb://localhost:27017/')
插入数据
db = client['test'] # 使用test库
students = db['students'] # 创建集合
# 插入单条
data = {'id':'1001','name':'张三','age':20,'gender':'男'}
result = students.insert_one(data)
# 插入多条
result = students.insert_many([
{'id':'1002','name':'李四','age':22,'gender':'男'},
{'id':'1003','name':'王五','age':24,'gender':'女'}
])
查询数据
# 查询单条
result = students.find_one({'name':'李四'})
# 查询多条
results = students.find({'gender':'男'})
for r in results:
print(r)
# 比较查询
students.find({'age':{'$gt':20}}) # 年龄大于20
更新数据
query = {"name":"张三"}
new_values = {"$set": {"age":25}}
result = students.update_many(query, new_values)
删除数据
# 删除单条
students.delete_one({"name": "张三"})
# 删除多条
students.delete_many({"age": {"$gt":22}})
# 删除所有
students.delete_many({})
三、Redis内存数据库
1. Redis简介
Redis是基于内存的键值存储系统,特点包括:
- 支持多种数据结构:字符串、哈希、列表、集合等
- 极高性能,适合高速读写和缓存
- 支持数据持久化
- 不适合存储大量数据
2. 安装与配置
- 安装Redis服务
- 安装Python操作库:
pip install redis
3. Redis数据类型
- 字符串(string):最基本的数据类型
- 哈希(hash):键值对集合
- 列表(list):有序字符串列表
- 集合(set):无序唯一元素集合
- 有序集合(zset):带分数的集合
4. Python操作Redis
连接数据库
from redis import StrictRedis
redis = StrictRedis(host='localhost', port=6379, decode_responses=True)
字符串操作
# 设置值(带过期时间)
redis.set('name', '张三', ex=3)
# 获取值
redis.get('name')
# 批量操作
redis.mset({'key1':'value1', 'key2':'value2'})
redis.mget('key1', 'key2')
哈希操作
# 设置哈希字段
redis.hset('hash1', 'key1', 'value1')
# 获取所有字段
redis.hkeys('hash1')
# 获取字段值
redis.hget('hash1', 'key1')
# 批量操作
redis.hmset('hash2', {'key3':'value3', 'key4':'value4'})
redis.hmget('hash2', 'key3', 'key4')
列表操作
# 左/右插入
redis.lpush('grade', 88, 87, 92)
redis.rpush('grade', 78, 67, 99)
# 获取范围
redis.lrange('grade', 0, -1)
# 修改元素
redis.lset('grade', 0, 77)
# 删除元素
redis.lrem('grade', 87, 1) # 删除1个87
集合操作
# 添加元素
redis.sadd('count', 88, 87, 92)
# 获取所有元素
redis.smembers('count')
# 集合运算
redis.sdiff('set1', 'set2') # 差集
redis.sinter('set1', 'set2') # 交集
redis.sunion('set1', 'set2') # 并集
有序集合操作
# 添加元素(带分数)
redis.zadd('fruit', {'apple':10, 'banana':6})
# 范围查询
redis.zrange('fruit', 0, -1) # 升序
redis.zrevrange('fruit', 0, -1) # 降序
# 获取分数
redis.zscore('fruit', 'apple')
四、数据库对比与选择建议
| 特性 | MySQL | MongoDB | Redis |
|---|---|---|---|
| 类型 | 关系型 | 文档型 | 键值对 |
| 查询语言 | SQL | 类JSON查询 | 命令 |
| 数据结构 | 表 | 文档 | 多种 |
| 事务支持 | 支持 | 不支持 | 有限支持 |
| 性能 | 中等 | 高 | 极高 |
| 适用场景 | 结构化数据、事务 | 半结构化数据、大数据 | 缓存、高速读写 |
| 数据量 | 大 | 极大 | 小 |
选择建议:
- 需要强一致性、事务支持:选择MySQL
- 处理半结构化、大数据量:选择MongoDB
- 需要高速读写、缓存:选择Redis
- 复杂场景可考虑组合使用,如MySQL存储核心数据,Redis做缓存,MongoDB存储日志等非结构化数据
五、总结
本文详细介绍了三种数据库的基本原理和Python操作方法。掌握这些数据库技术,能够根据实际需求选择最合适的存储方案,是爬虫开发者必备的技能。建议读者在实际项目中多加练习,深入理解各种数据库的特性和适用场景。