【愚公系列】《Python网络爬虫从入门到精通》038-SQLite数据库
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳...
标题 | 详情 |
---|---|
作者简介 | 愚公搬代码 |
头衔 | 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。 |
近期荣誉 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。 |
博客内容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 |
欢迎 | 👍点赞、✍评论、⭐收藏 |
🚀前言
在数据爬取的过程中,如何高效地存储和管理抓取到的信息,是每个网络爬虫开发者必须面对的挑战。SQLite数据库作为一种轻量级、易于使用的关系型数据库,提供了一个理想的解决方案,尤其适用于中小型项目。它不仅可以帮助我们高效存储大量数据,还能方便地进行查询和分析。
我们将深入探讨如何在网络爬虫中使用SQLite数据库。我们将介绍SQLite的基本概念、在Python中如何使用SQLite进行数据存取,以及与网络爬虫结合的实际应用。通过具体的实例,你将学习到如何创建数据库、设计数据表、插入和查询数据,从而实现数据的持久化存储。
🚀一、📚 Python操作SQLite数据库全指南
🔎1.SQLite核心特性
-
嵌入式数据库:单个文件存储所有数据(表/索引/定义) -
零配置:无需服务器,即开即用 -
跨平台:数据库文件可在不同系统间迁移 -
轻量高效:C语言编写,内存占用低 -
Python内置支持:无需安装第三方库( import sqlite3
)

🔎2.数据库基础操作
🦋2.1 创建/连接数据库
import sqlite3
# 连接数据库(不存在则创建)
conn = sqlite3.connect('mrsoft.db')
cursor = conn.cursor() # 创建游标对象
🦋2.2 创建数据表
# 创建用户表(仅需执行一次)
cursor.execute('''
CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY,
name VARCHAR(20) NOT NULL
)
''')
conn.commit() # 提交事务
🦋2.3 关闭连接
cursor.close()
conn.close() # 重要!确保数据持久化
🔎3.CRUD操作详解
🦋3.1 插入数据(Create)
# 单条插入
cursor.execute("INSERT INTO user (id, name) VALUES (?, ?)", (1, "MRSOFT"))
# 批量插入
users = [(2, "Andy"), (3, "明日科技小助手")]
cursor.executemany("INSERT INTO user VALUES (?,?)", users)
conn.commit() # 提交事务
🦋3.2 查询数据(Read)
cursor.execute("SELECT * FROM user WHERE id > ?", (1,))
# 获取结果
first_row = cursor.fetchone() # 获取第一条
next_two = cursor.fetchmany(2) # 再获取两条
all_remaining = cursor.fetchall() # 获取剩余所有
🦋3.3 更新数据(Update)
cursor.execute("UPDATE user SET name=? WHERE id=?", ("MR", 1))
conn.commit() # 提交修改
🦋3.4 删除数据(Delete)
cursor.execute("DELETE FROM user WHERE id=?", (1,))
conn.commit()
🔎4.查询方法对比
方法 | 返回结果 | 使用场景 |
---|---|---|
.fetchone() |
单条记录(tuple) | 逐行处理大数据 |
.fetchmany(size) |
指定数量记录的列表 | 分页加载/分批处理 |
.fetchall() |
所有记录的列表 | 数据量小时一次性获取 |
🔎5.安全与优化
🦋5.1 防止SQL注入
-
错误方式:直接拼接字符串 # 危险!易被注入攻击 cursor.execute(f"SELECT * FROM user WHERE name='{user_input}'")
-
正确方式:参数化查询 cursor.execute("SELECT * FROM user WHERE name=?", (user_input,))
🦋5.2 事务管理
try:
cursor.execute("INSERT INTO user VALUES (4, '新用户')")
conn.commit() # 成功则提交
except sqlite3.Error as e:
conn.rollback() # 失败则回滚
print(f"操作失败: {e}")
🦋5.3 使用上下文管理器
with sqlite3.connect('mrsoft.db') as conn:
cursor = conn.cursor()
cursor.execute("SELECT * FROM user")
# 自动提交/关闭连接
🔎6.数据类型对照
SQLite类型 | Python类型 | 说明 |
---|---|---|
INTEGER | int | 整型 |
REAL | float | 浮点数 |
TEXT | str | 字符串 |
BLOB | bytes | 二进制数据 |
NULL | None | 空值 |
🔎7.常见问题解决
🦋7.1 表已存在错误
OperationalError: table user already exists
解决方案:使用CREATE TABLE IF NOT EXISTS
🦋7.2 数据未持久化
现象:插入数据后重启程序数据丢失
原因:未执行conn.commit()
修复:显式提交事务或启用自动提交模式
conn = sqlite3.connect('mrsoft.db', isolation_level=None)
🦋7.3 并发写入冲突
建议:SQLite适合低频写入场景,高并发考虑其他数据库(如MySQL)
🔎8.完整示例
import sqlite3
def main():
with sqlite3.connect('mrsoft.db') as conn:
cursor = conn.cursor()
# 建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS user (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
)
''')
# 插入数据
cursor.executemany("INSERT INTO user VALUES (?,?)",
[(1, 'MRSOFT'), (2, 'Andy')])
# 查询数据
cursor.execute("SELECT * FROM user")
print("所有用户:", cursor.fetchall())
if __name__ == "__main__":
main()
最佳实践建议:
-
始终使用参数化查询防止注入 -
使用 WITH
语句管理连接 -
频繁写入时批量提交事务 -
为常用查询字段创建索引提升性能
CREATE INDEX idx_user_name ON user(name);
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)