【愚公系列】《Python网络爬虫从入门到精通》038-SQLite数据库

举报
愚公搬代码 发表于 2025/05/06 22:29:32 2025/05/06
【摘要】 标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,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()

最佳实践建议:

  1. 始终使用参数化查询防止注入
  2. 使用WITH语句管理连接
  3. 频繁写入时批量提交事务
  4. 为常用查询字段创建索引提升性能
CREATE INDEX idx_user_name ON user(name);
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。