Python Scrapy 爬虫实战进阶系列(一):轻量化数据存储 - 数据精准写入 SQLite 数据库 前言在 Python 爬虫开发领域中Scrapy 作为高性能、高可扩展性的异步爬虫框架是行业内采集结构化数据的首选工具。在中小型爬虫项目、本地数据采集、轻量化数据存储场景中SQLite 无需独立服务、单文件存储、原生兼容 Python 的特性完美匹配 Scrapy 爬虫的轻量化部署需求。本系列第一篇将从零到一实现 Scrapy 爬虫数据写入 SQLite 数据库的完整方案涵盖环境搭建、项目创建、数据建模、管道开发、数据入库、数据校验全流程同时深度解析核心原理为后续进阶开发奠定基础。本文涉及的核心依赖与官方资源如下可直接点击访问Scrapy 官方文档Scrapy 框架权威使用指南Python 官方下载Python 运行环境3.8 及以上版本最佳SQLite 官方文档轻量化关系型数据库官方资料SQLiteStudio 可视化工具免费 SQLite 数据可视化管理工具本文采用专家级书面语结合实战案例、原理剖析、代码详解覆盖 ScrapySQLite 整合全流程适合具备 Python 基础、爬虫入门开发者学习可直接应用于生产级轻量化爬虫项目。一、开发环境准备与依赖安装1.1 环境要求本项目基于 Python 3.8 开发兼容 Windows、macOS、Linux 全平台无特殊硬件要求核心依赖仅包含 Scrapy 框架Python 内置sqlite3库无需额外安装。1.2 核心依赖安装打开系统终端Windows 为 CMD/PowerShellmacOS/Linux 为 Terminal执行以下命令安装 Scrapy 框架bash运行# 安装Scrapy最新稳定版 pip install scrapy # 验证安装是否成功 scrapy version执行成功后终端会输出 Scrapy、Twisted、lxml 等依赖版本信息证明环境搭建完成。1.3 依赖核心说明Scrapy异步爬虫框架提供请求发送、数据解析、管道处理、中间件等全功能组件是本项目的核心框架。sqlite3Python 内置标准库无需单独安装提供 SQLite 数据库的连接、创建表、增删改查等所有操作。SQLiteStudio可选可视化工具用于查看爬虫入库后的数据提升开发调试效率。二、Scrapy 项目创建与基础结构解析2.1 创建 Scrapy 项目在本地创建一个空文件夹建议命名为scrapy_sqlite_demo进入文件夹后执行 Scrapy 创建命令bash运行# 创建爬虫项目 scrapy startproject sqlite_spider # 进入项目目录 cd sqlite_spider执行完成后会自动生成标准的 Scrapy 项目结构这是 Scrapy 官方规定的模块化结构所有开发工作均在此结构内完成。2.2 项目核心文件作用详解为了让开发者清晰理解每个文件的功能通过表格形式详细说明表格文件 / 文件夹名称核心作用sqlite_spider/项目核心代码包所有爬虫逻辑、管道、配置均在此处__init__.pyPython 包标识文件无业务代码用于标识目录为 Python 包items.py数据建模文件定义爬虫采集的字段结构统一数据格式middlewares.py中间件文件用于处理请求、响应、异常等扩展逻辑pipelines.py管道文件核心用于数据处理、数据入库、数据清洗settings.py项目配置文件配置并发数、请求头、管道、延迟等核心参数spiders/爬虫文件夹存放所有爬虫脚本一个栏目 / 站点对应一个爬虫文件scrapy.cfg项目部署配置文件用于项目打包、部署、远程运行2.3 创建爬虫文件在spiders文件夹下创建爬虫脚本本案例以采集公开图书榜单数据为例创建爬虫bash运行# 创建爬虫名称book_spider允许域名book.douban.com scrapy genspider book_spider book.douban.com执行后spiders文件夹下会生成book_spider.py爬虫文件后续数据解析逻辑在此文件编写。三、数据建模定义 Item 数据结构3.1 Item 作用原理Item 是 Scrapy 框架中数据容器作用是统一爬虫采集的数据格式避免不同爬虫、不同字段导致的数据混乱。爬虫解析的数据先封装到 Item 对象中再传递给 Pipeline 进行处理这是 Scrapy 数据流转的核心规范。3.2 编写 Item 代码打开items.py文件定义图书数据的字段包含图书名称、作者、出版社、出版日期、价格、评分代码如下python运行# Define here the models for your scraped items # # See documentation in: # https://docs.scrapy.org/en/latest/topics/items.html import scrapy class SqliteSpiderItem(scrapy.Item): 图书数据Item定义爬虫采集的所有字段 字段名称与数据库表字段一一对应便于数据入库 # 图书名称 book_name scrapy.Field() # 图书作者 book_author scrapy.Field() # 出版社 book_publisher scrapy.Field() # 出版日期 publish_date scrapy.Field() # 图书价格 book_price scrapy.Field() # 图书评分 book_score scrapy.Field()3.3 Item 定义规则所有字段必须使用scrapy.Field()定义无类型限制兼容字符串、数字、日期等所有数据类型。字段名称建议与数据库表字段保持一致减少管道中的字段映射工作。一个 Item 对应一类数据多类数据可创建多个 Item 类。四、SQLite 数据库表设计与创建4.1 SQLite 核心原理SQLite 是嵌入式关系型数据库核心特性无独立服务进程数据存储在单个.db文件中拷贝文件即可迁移数据库。支持标准 SQL 语法与 MySQL、Oracle 使用逻辑一致学习成本低。原生支持 Python无需配置连接信息适合轻量化爬虫项目。单文件存储无需部署数据库环境一键启动爬虫即可自动创建数据库。4.2 数据库表设计根据 Item 定义的字段设计book_info数据表表结构如下表格字段名数据类型约束说明idINTEGERPRIMARY KEY AUTOINCREMENT主键自增唯一标识book_nameTEXTNOT NULL图书名称非空book_authorTEXTNULL图书作者可为空book_publisherTEXTNULL出版社可为空publish_dateTEXTNULL出版日期可为空book_priceTEXTNULL图书价格可为空book_scoreREALNULL图书评分浮点型create_timeTIMESTAMPDEFAULT CURRENT_TIMESTAMP数据入库时间自动生成4.3 建表语句标准 SQL 建表语句后续在 Pipeline 中执行sqlCREATE TABLE IF NOT EXISTS book_info ( id INTEGER PRIMARY KEY AUTOINCREMENT, book_name TEXT NOT NULL, book_author TEXT, book_publisher TEXT, publish_date TEXT, book_price TEXT, book_score REAL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP );语句说明IF NOT EXISTS避免重复创建表爬虫多次启动不会报错。AUTOINCREMENT主键自动递增无需手动赋值。DEFAULT CURRENT_TIMESTAMP自动记录数据入库时间无需爬虫传递。五、核心开发Pipeline 实现数据写入 SQLite5.1 Scrapy Pipeline 工作原理Pipeline 是 Scrapy 的数据处理管道核心工作流程爬虫解析数据 → 封装为 Item → 自动传递给 Pipeline。Pipeline 接收 Item 后可执行数据清洗、数据验证、数据入库、数据去重等操作。一个项目可配置多个 Pipeline按优先级顺序执行。必须在settings.py中启用 Pipeline否则数据不会进入管道处理。本项目中Pipeline 的核心职责连接 SQLite 数据库 → 创建数据表 → 接收 Item → 插入数据到数据库。5.2 编写 SQLite Pipeline 代码打开pipelines.py文件编写完整的数据入库逻辑代码带详细注释python运行# Define your item pipelines here # # Dont forget to add your pipeline to the ITEM_PIPELINES setting # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html import sqlite3 from itemadapter import ItemAdapter class SqliteSpiderPipeline: SQLite数据入库管道 实现数据库连接、表创建、数据插入、数据库关闭全流程 def __init__(self): 初始化方法创建数据库连接、创建游标、创建数据表 爬虫启动时自动执行一次 # 1. 连接SQLite数据库文件名为data.db不存在则自动创建 self.conn sqlite3.connect(data.db) # 2. 创建数据库游标用于执行SQL语句 self.cursor self.conn.cursor() # 3. 执行建表语句 self.create_table() def create_table(self): 创建图书数据表不存在则创建 create_sql CREATE TABLE IF NOT EXISTS book_info ( id INTEGER PRIMARY KEY AUTOINCREMENT, book_name TEXT NOT NULL, book_author TEXT, book_publisher TEXT, publish_date TEXT, book_price TEXT, book_score REAL, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); # 执行SQL语句 self.cursor.execute(create_sql) # 提交事务 self.conn.commit() def process_item(self, item, spider): 核心方法处理每个Item插入数据库 每传递一个Item该方法执行一次 # 适配Item获取字段数据 adapter ItemAdapter(item) # 4. 插入数据SQL语句?为SQLite占位符防止SQL注入 insert_sql INSERT INTO book_info ( book_name, book_author, book_publisher, publish_date, book_price, book_score ) VALUES (?, ?, ?, ?, ?, ?); # 5. 提取Item中的数据按顺序组成元组 data ( adapter.get(book_name), adapter.get(book_author), adapter.get(book_publisher), adapter.get(publish_date), adapter.get(book_price), adapter.get(book_score) ) # 6. 执行插入语句 self.cursor.execute(insert_sql, data) # 7. 提交事务保存数据到数据库 self.conn.commit() # 返回Item便于后续管道处理如果有多个管道 return item def close_spider(self, spider): 爬虫关闭时自动执行 关闭数据库游标和连接释放资源 self.cursor.close() self.conn.close()5.3 代码核心原理剖析__init__方法爬虫启动时执行仅执行一次负责初始化数据库连接和创建表避免重复操作。create_table方法封装建表逻辑提高代码可读性和可维护性。process_item方法Pipeline 核心方法必须实现接收 Item 和爬虫对象处理数据插入。占位符?SQLite 安全语法替代字符串拼接彻底防止 SQL 注入漏洞生产环境必须使用。close_spider方法爬虫关闭时执行关闭数据库连接避免资源泄漏。事务提交commit()SQLite 默认开启事务执行增删改后必须提交否则数据不会持久化。5.4 启用 Pipeline 配置打开settings.py文件找到ITEM_PIPELINES配置项取消注释并修改为python运行# Configure item pipelines # See https://docs.scrapy.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES { # 键管道类路径值优先级0-1000数字越小优先级越高 sqlite_spider.pipelines.SqliteSpiderPipeline: 300, }配置说明只有启用该配置爬虫的 Item 才会进入自定义的 SQLite 管道否则数据不会入库。六、爬虫逻辑开发数据解析与 Item 封装6.1 爬虫开发原理爬虫文件的核心职责发送请求 → 获取响应 → 解析 HTML → 封装数据到 Item → 提交 Item 到 Pipeline。 Scrapy 基于 Twisted 异步框架自动处理并发请求无需手动管理线程提升采集效率。6.2 编写爬虫解析代码打开spiders/book_spider.py文件编写数据解析逻辑本案例采集豆瓣图书榜单数据python运行import scrapy # 导入自定义的Item类 from sqlite_spider.items import SqliteSpiderItem class BookSpiderSpider(scrapy.Spider): # 爬虫名称启动爬虫时使用 name book_spider # 允许爬取的域名防止爬虫爬取其他站点 allowed_domains [book.douban.com] # 起始URL爬虫启动后首先请求该地址 start_urls [https://book.douban.com/top250] def parse(self, response): 解析响应数据的核心方法 response请求返回的响应对象包含HTML、headers等信息 # 1. 使用XPath解析图书列表匹配所有图书项 book_list response.xpath(//tr[classitem]) # 遍历每一本图书 for book in book_list: # 2. 创建Item对象封装数据 item SqliteSpiderItem() # 解析图书名称 item[book_name] book.xpath(.//div[classpl2]/a/title).extract_first().strip() # 解析图书信息作者、出版社、日期、价格 book_info book.xpath(.//p[classpl]/text()).extract_first().split( / ) # 赋值作者 item[book_author] book_info[0] if len(book_info) 0 else # 赋值出版社 item[book_publisher] book_info[1] if len(book_info) 1 else # 赋值出版日期 item[publish_date] book_info[2] if len(book_info) 2 else # 赋值价格 item[book_price] book_info[3] if len(book_info) 3 else # 解析图书评分 item[book_score] book.xpath(.//span[classrating_nums]/text()).extract_first() # 3. 提交Item到Pipeline自动触发数据入库 yield item # 4. 解析下一页链接实现翻页采集 next_page response.xpath(//span[classnext]/a/href).extract_first() if next_page: # 拼接完整URL next_url response.urljoin(next_page) # 发送下一页请求回调parse方法继续解析 yield scrapy.Request(next_url, callbackself.parse)6.3 爬虫代码核心解析爬虫标识name是爬虫唯一名称启动爬虫时必须使用该名称。XPath 解析Scrapy 原生支持 XPath/CSS 选择器是 HTML 解析的高效工具extract_first()获取单个数据extract()获取列表数据。yield item将封装好的 Item 提交给框架自动传递到 Pipeline 处理这是 Scrapy 数据提交的标准方式。翻页逻辑自动解析下一页链接递归发送请求实现全量数据采集。容错处理使用if判断数据长度避免数据缺失导致程序崩溃。七、项目配置优化7.1 基础配置优化打开settings.py文件修改以下配置提升爬虫稳定性和合规性python运行# 1. 设置请求头模拟浏览器访问防止被反爬 USER_AGENT Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 # 2. 关闭 robots 协议检查根据目标站点规则调整学习环境使用 ROBOTSTXT_OBEY False # 3. 设置并发请求数默认16轻量化项目调低避免给服务器造成压力 CONCURRENT_REQUESTS 4 # 4. 设置请求延迟单位秒防止请求过快被封IP DOWNLOAD_DELAY 1 # 5. 启用日志级别减少冗余日志DEBUG/INFO/WARNING/ERROR LOG_LEVEL INFO7.2 配置作用原理USER_AGENT伪装成浏览器大部分站点会拦截无 UA 的爬虫请求。ROBOTSTXT_OBEY是否遵守站点爬虫协议学习环境可关闭生产环境需遵守站点规则。CONCURRENT_REQUESTS控制并发数轻量化 SQLite 不支持高并发写入调低数值保证数据入库稳定。DOWNLOAD_DELAY请求间隔降低目标服务器压力避免被反爬机制封禁。LOG_LEVEL日志级别INFO 级别仅输出关键日志便于调试。八、启动爬虫与数据验证8.1 启动 Scrapy 爬虫进入项目根目录执行以下命令启动爬虫bash运行# 启动爬虫名称为爬虫文件中定义的name scrapy crawl book_spider启动成功后终端输出 INFO 日志显示爬虫开始请求、解析数据、插入数据库的过程。8.2 数据校验方式方式 1使用 SQLiteStudio 可视化工具推荐打开 SQLiteStudio 工具点击「添加数据库」。选择项目根目录下自动生成的data.db文件加载数据库。展开book_info表查看数据所有爬虫采集的数据已完整入库。方式 2使用 Python 代码查询数据在项目根目录创建query_data.py文件执行查询语句python运行import sqlite3 # 连接数据库 conn sqlite3.connect(data.db) cursor conn.cursor() # 查询所有数据 cursor.execute(SELECT * FROM book_info) data cursor.fetchall() # 打印数据条数和前3条数据 print(f总采集数据量{len(data)} 条) print(前3条数据) for item in data[:3]: print(item) # 关闭连接 cursor.close() conn.close()执行脚本终端输出数据证明入库成功。九、项目核心知识点总结与扩展9.1 核心流程总结本项目完整实现了 ScrapySQLite 轻量化数据存储方案核心流程环境安装 → 项目创建 → Item 数据建模。数据库表设计 → Pipeline 数据入库开发。爬虫解析开发 → 配置优化 → 启动爬虫 → 数据校验。数据自动存储在data.db文件中可直接迁移、分析、导出。9.2 关键技术点Scrapy 数据流转请求→解析→Item→Pipeline→数据库标准化流程。SQLite 安全写入使用占位符防止 SQL 注入事务提交保证数据持久化。异步采集Scrapy 异步框架高效采集轻量化数据库无性能瓶颈。模块化开发Item、Pipeline、爬虫分离符合软件工程规范。9.3 扩展优化方向数据去重在 Pipeline 中添加去重逻辑根据图书名称判断数据是否已存在避免重复入库。数据清洗在process_item中对价格、评分进行格式转换统一数据类型。多表存储创建多个 Item 和 Pipeline实现不同类型数据分别入库。异常捕获在数据库操作中添加try-except捕获数据库连接异常、数据插入异常保证爬虫稳定运行。批量插入采集大量数据时使用executemany批量插入提升入库效率。9.4 扩展代码数据去重 异常捕获优化pipelines.py中的process_item方法增加去重和异常处理python运行def process_item(self, item, spider): adapter ItemAdapter(item) try: # 数据去重根据图书名称判断是否已存在 check_sql SELECT id FROM book_info WHERE book_name ? self.cursor.execute(check_sql, (adapter.get(book_name),)) if self.cursor.fetchone(): self.logger.info(f数据已存在{adapter.get(book_name)}跳过插入) return item # 插入数据 insert_sql INSERT INTO book_info (book_name, book_author, book_publisher, publish_date, book_price, book_score) VALUES (?, ?, ?, ?, ?, ?); data ( adapter.get(book_name), adapter.get(book_author), adapter.get(book_publisher), adapter.get(publish_date), adapter.get(book_price), adapter.get(book_score) ) self.cursor.execute(insert_sql, data) self.conn.commit() self.logger.info(f数据插入成功{adapter.get(book_name)}) except Exception as e: # 回滚事务保证数据一致性 self.conn.rollback() self.logger.error(f数据插入失败{str(e)}数据{adapter.get(book_name)}) return item该优化解决了重复数据入库、数据库异常导致程序崩溃的问题生产环境可直接使用。十、项目部署与注意事项10.1 项目部署本项目为轻量化爬虫部署极其简单将整个项目文件夹拷贝到目标服务器Windows/Linux/macOS 均可。服务器安装 Python3.8 和 Scrapy 依赖。执行启动命令自动生成数据库并采集数据。10.2 注意事项SQLite 并发限制SQLite 不支持高并发写入Scrapy 并发数建议设置为 1-4避免数据库锁表。数据备份定期拷贝data.db文件实现数据备份防止文件丢失。反爬合规爬虫需遵守目标站点规则仅采集公开数据禁止用于商业用途和非法采集。资源释放必须实现close_spider方法关闭数据库连接避免文件占用。日志监控通过日志查看爬虫运行状态及时处理异常。