Python 爬虫项目 Scrapy 爬虫结果批量导出 CSV 与 Excel

发布时间:2026/6/7 22:19:27

Python 爬虫项目 Scrapy 爬虫结果批量导出 CSV 与 Excel 前言Scrapy 爬虫完成页面解析与数据提取后除对接数据库实现持久化存储外文件导出也是数据落地的主流方式。CSV、Excel 作为通用电子表格格式具备可读性强、兼容性广、无需额外数据库环境、便于本地查看与二次编辑等特点广泛应用于中小型采集项目、临时数据统计、离线数据分析、数据交接等场景。Scrapy 框架原生提供了基础文件导出能力同时结合第三方扩展库可实现格式美化、大数据量分批导出、多工作表拆分等高级功能。本文围绕 Scrapy 批量导出 CSV 与 Excel 展开全维度实战涵盖原生命令导出、自定义管道导出、分批次导出、大文件优化、格式定制、编码问题处理、异常兼容等内容区分基础用法与生产级优化方案适配不同数据量级与业务需求所有代码与操作流程均可直接落地使用。本文涉及的核心依赖库、工具及官方文档链接如下可直接跳转查阅参考资料Scrapy 官方文档框架内置导出器、管道、命令行参数完整说明csv 模块官方文档Python 标准库 CSV 读写接口与规范openpyxl 官方文档主流 Excel 读写库支持 xlsx 格式与样式定制pandas 官方文档数据分析库支持高效批量数据导出与格式转换xlwt 官方文档老式 xls 格式 Excel 写入库适配低版本办公软件一、环境准备与依赖说明1.1 基础运行环境本文案例基于 Python 3.7、Scrapy 2.5 版本开发系统兼容 Windows、Linux、macOS。原生 CSV 导出仅依赖 Python 标准库无需额外安装组件Excel 格式导出需要安装第三方扩展库不同库适配的 Excel 格式、性能、功能存在明显区别。1.2 主流文件操作库对比结合爬虫业务场景对 Python 生态中常用的表格操作库进行对比方便根据需求选型表格库名称支持格式依赖类型性能表现核心特点适用场景Python 内置 csv.csv标准库无需安装极高轻量、无额外依赖、读写速度快不支持样式设置大批量数据导出、纯文本表格、服务器无外网环境openpyxl.xlsxExcel 2007第三方库中等支持单元格样式、合并单元格、多工作表、公式编辑需美化格式、分工作表存储、本地精细化数据整理xlwt.xlsExcel 97-2003第三方库中等兼容老旧办公软件格式单一单文件行数存在上限对接低版本办公系统、老旧终端设备pandas.csv/.xlsx/.xls第三方库依赖较多高底层优化读写逻辑支持数据清洗、分批导出、数据转换十万级以上大数据量导出、数据预处理后导出1.3 依赖库安装命令根据所需导出格式执行对应安装命令服务器环境优先选择标准库与轻量组件bash运行# 安装 openpyxl推荐主流 xlsx 格式 pip install openpyxl # 安装 xlwt兼容老式 xls 格式按需安装 pip install xlwt # 安装 pandas大数据量导出、数据处理场景使用 pip install pandas1.4 基础项目准备沿用标准 Scrapy 项目结构若需新建项目执行以下命令快速搭建测试环境bash运行# 创建项目 scrapy startproject file_export_demo # 进入项目目录 cd file_export_demo # 创建测试爬虫 scrapy genspider data_spider example.com后续所有导出逻辑、管道代码均基于该项目开发首先完成 Item 字段定义与爬虫解析逻辑统一测试数据源。二、定义 Item 与基础爬虫逻辑2.1 编写 Item 数据模型打开项目内items.py文件定义通用数据字段模拟资讯类爬虫采集内容该字段结构将作为表格列名与数据载体python运行import scrapy class ExportDataItem(scrapy.Item): # 标题 title scrapy.Field() # 访问链接 url scrapy.Field() # 发布时间 publish_time scrapy.Field() # 内容摘要 summary scrapy.Field() # 分类标签 category scrapy.Field() # 采集时间 crawl_time scrapy.Field()2.2 编写测试爬虫打开spiders/data_spider.py编写爬虫逻辑批量生成测试数据模拟真实页面解析流程为导出功能提供数据源python运行import scrapy from datetime import datetime from file_export_demo.items import ExportDataItem class DataSpider(scrapy.Spider): name data_spider allowed_domains [example.com] start_urls [https://example.com] def parse(self, response): # 模拟生成20条测试数据批量测试导出功能 for i in range(1, 21): item ExportDataItem() item[title] f测试资讯标题_{i} item[url] fhttps://example.com/article/{i} item[publish_time] f2026-06-07 0{i}:00:00 item[summary] f第{i}条资讯内容摘要用于文件导出功能测试 item[category] 综合资讯 if i % 2 0 else 科技资讯 item[crawl_time] datetime.now().strftime(%Y-%m-%d %H:%M:%S) yield item2.3 全局基础配置修改settings.py关闭冗余配置、统一编码格式规避中文乱码问题这是文件导出的前置基础配置python运行# 关闭robots协议检测 ROBOTSTXT_OBEY False # 关闭Cookie跟踪 COOKIES_ENABLED False # 设置日志级别 LOG_LEVEL INFO # 全局编码设置解决CSV/Excel中文乱码核心配置 FEED_EXPORT_ENCODING utf-8FEED_EXPORT_ENCODING为 Scrapy 全局导出编码配置设置为utf-8可适配绝大多数系统与办公软件是解决中文乱码的关键参数。三、Scrapy 原生命令行导出 CSVScrapy 内置 Feed 导出器无需编写任何额外代码直接通过终端命令即可将爬虫结果导出为 CSV 文件该方式操作简单、上手快速适合临时导出、快速数据预览场景。3.1 基础导出命令进入项目根目录执行以下命令启动爬虫并自动导出数据为 CSV 文件bash运行# 基础命令导出为 result.csv 文件 scrapy crawl data_spider -o result.csv命令执行完成后项目根目录下会生成result.csv文件文件列名对应 Item 字段每行存储一条采集数据。3.2 命令行扩展参数与用法3.2.1 指定导出格式与路径通过-t参数指定文件格式同时支持自定义文件存储路径适配分类存储需求bash运行# 指定格式自定义路径导出到data目录下 scrapy crawl data_spider -o ./data/export_data.csv -t csv3.2.2 覆盖 / 追加写入模式默认情况下重复执行命令会覆盖原有文件如需向已有文件追加数据需结合系统命令或修改导出模式。Scrapy 原生 Feed 导出不支持直接追加临时场景可手动拼接文件长期追加建议使用自定义管道。3.2.3 调整字段顺序与指定导出字段原生导出默认按照 Item 定义顺序排列列名若需要自定义列顺序、仅导出部分字段可通过配置文件设置 在settings.py中添加以下配置python运行# 自定义导出字段及顺序仅导出指定字段 FEED_EXPORT_FIELDS [title, category, url, publish_time]配置完成后重新执行导出命令表格将仅保留配置内的字段且列顺序与配置顺序保持一致。3.3 原生 CSV 导出核心原理Scrapy 内置CsvItemExporter导出器爬虫产出 Item 对象后导出器自动读取字段并按照 CSV 格式规范拼接文本编码由FEED_EXPORT_ENCODING全局控制数据流转过程中不经过额外转换性能损耗极低命令行-o参数本质是调用 Feed 模块支持 csv、json、xml 等多种格式属于框架原生能力。3.4 原生命令导出优缺点表格优势劣势零代码实现操作便捷适合临时使用功能单一无法定制样式、无法分批导出底层基于标准库性能优秀无第三方依赖不支持数据预处理、字段重命名、内容格式化服务器环境兼容性极强重复执行会覆盖文件不支持增量追加数据四、自定义管道导出 CSV进阶方案命令行导出灵活性不足正式项目中更多使用自定义管道实现 CSV 导出。管道方式支持数据预处理、字段重命名、分批写入、增量追加、日志监控等功能可深度结合爬虫业务逻辑是工程化项目的首选方案。4.1 编写 CSV 导出管道打开项目pipelines.py文件创建自定义 CSV 管道实现文件创建、表头写入、数据逐行写入、资源释放完整逻辑python运行import csv import os from file_export_demo.settings import FEED_EXPORT_ENCODING class CsvExportPipeline: def __init__(self): # 定义导出文件路径 self.file_path ./spider_data.csv # 文件句柄 self.file_handle None # CSV写入对象 self.csv_writer None # 标记是否首次写入用于添加表头 self.is_first_write True # 定义表头名称可自定义中文列名 self.headers [资讯标题, 访问链接, 发布时间, 内容摘要, 分类标签, 采集时间] def open_spider(self, spider): 爬虫启动时执行初始化文件 # 判断文件是否存在不存在则新建 file_exist os.path.exists(self.file_path) # 打开文件a为追加模式w为覆盖模式 self.file_handle open( self.file_path, modea, encodingFEED_EXPORT_ENCODING, newline ) # 创建CSV写入器 self.csv_writer csv.writer(self.file_handle) # 文件不存在时写入表头 if not file_exist: self.csv_writer.writerow(self.headers) spider.logger.info(CSV文件表头写入完成) def process_item(self, item, spider): 处理单条数据写入CSV文件 # 提取Item中的数据顺序与表头一一对应 row_data [ item.get(title, ), item.get(url, ), item.get(publish_time, ), item.get(summary, ), item.get(category, ), item.get(crawl_time, ) ] # 写入单行数据 self.csv_writer.writerow(row_data) return item def close_spider(self, spider): 爬虫关闭时关闭文件句柄释放资源 if self.file_handle: self.file_handle.close() spider.logger.info(fCSV文件导出完成文件路径{self.file_path})4.2 启用 CSV 管道在settings.py中注册自定义管道使其生效python运行ITEM_PIPELINES { file_export_demo.pipelines.CsvExportPipeline: 200, }4.3 运行爬虫测试执行爬虫启动命令无需额外参数数据会自动写入指定 CSV 文件bash运行scrapy crawl data_spider执行完成后查看项目根目录下的spider_data.csv可见中文表头与完整采集数据。4.4 管道核心代码原理open_spider 生命周期方法爬虫启动时仅执行一次负责初始化文件流与 CSV 写入对象判断文件状态并写入表头采用a追加模式多次运行爬虫可增量写入数据不会覆盖历史内容newline 参数CSV 写入标准配置消除不同系统下多余空行问题统一文件格式process_item 方法每条 Item 都会进入该方法按表头顺序提取数据并逐行写入可在该方法内增加数据清洗、字段过滤等预处理逻辑close_spider 方法爬虫停止后关闭文件句柄避免文件占用、资源泄露保证文件内容完整落地。4.5 大数据量分批写入优化当采集数据达到十万级、百万级时频繁单行写入会降低性能可增加缓存队列累计指定条数后批量写入优化管道代码如下python运行import csv import os class CsvBatchExportPipeline: def __init__(self): self.file_path ./batch_data.csv self.file_handle None self.csv_writer None self.is_first_write True self.headers [资讯标题, 访问链接, 发布时间, 内容摘要, 分类标签, 采集时间] # 数据缓存列表 self.data_cache [] # 批量写入阈值 self.batch_size 100 def open_spider(self, spider): file_exist os.path.exists(self.file_path) self.file_handle open(self.file_path, modea, encodingutf-8, newline) self.csv_writer csv.writer(self.file_handle) if not file_exist: self.csv_writer.writerow(self.headers) def process_item(self, item, spider): row_data [ item.get(title, ), item.get(url, ), item.get(publish_time, ), item.get(summary, ), item.get(category, ), item.get(crawl_time, ) ] self.data_cache.append(row_data) # 达到阈值则批量写入 if len(self.data_cache) self.batch_size: self.csv_writer.writerows(self.data_cache) self.data_cache.clear() return item def close_spider(self, spider): # 写入缓存中剩余数据 if self.data_cache: self.csv_writer.writerows(self.data_cache) if self.file_handle: self.file_handle.close()该方案通过writerows实现批量写入大幅减少文件 IO 次数显著提升大文件导出速度。五、openpyxl 实现 Excelxlsx导出CSV 格式无法设置单元格样式、颜色、合并单元格、多工作表针对需要格式美化的场景使用openpyxl库实现标准 xlsx 格式 Excel 导出支持丰富的样式定制功能是本地精细化数据导出的主流方案。5.1 编写 Excel 基础导出管道基于 openpyxl 编写导出管道实现单工作表数据写入完整代码写入pipelines.pypython运行from openpyxl import Workbook from openpyxl.styles import Font, Alignment class ExcelExportPipeline: def __init__(self): self.file_path ./spider_data.xlsx # 工作簿对象 self.wb None # 工作表对象 self.ws None # 行号标记从第2行开始写入数据第1行为表头 self.row_index 2 # 表头配置 self.headers [资讯标题, 访问链接, 发布时间, 内容摘要, 分类标签, 采集时间] def open_spider(self, spider): # 创建空白工作簿 self.wb Workbook() # 获取默认工作表 self.ws self.wb.active # 设置工作表名称 self.ws.title 采集数据 # 写入表头第一行 self.ws.append(self.headers) # 自定义表头样式加粗、居中、字体大小 header_font Font(boldTrue, size11) header_alignment Alignment(horizontalcenter, verticalcenter) for col in range(1, len(self.headers) 1): cell self.ws.cell(row1, columncol) cell.font header_font cell.alignment header_alignment spider.logger.info(Excel工作簿与表头初始化完成) def process_item(self, item, spider): # 组装单行数据 row_data [ item.get(title, ), item.get(url, ), item.get(publish_time, ), item.get(summary, ), item.get(category, ), item.get(crawl_time, ) ] # 写入当前行 self.ws.append(row_data) self.row_index 1 return item def close_spider(self, spider): # 保存Excel文件 self.wb.save(self.file_path) spider.logger.info(fExcel文件导出完成路径{self.file_path})5.2 启用 Excel 管道修改settings.py中的管道配置注释原有 CSV 管道启用 Excel 管道python运行ITEM_PIPELINES { file_export_demo.pipelines.ExcelExportPipeline: 200, }5.3 运行测试与效果说明执行scrapy crawl data_spider启动爬虫项目目录生成spider_data.xlsx文件。打开文件可看到第一行表头字体加粗、居中对齐下方逐行展示采集数据格式规整美观。5.4 多工作表拆分导出实战当数据分类较多时可按照字段分类拆分至不同工作表例如将 “科技资讯” 与 “综合资讯” 分表存储扩展代码如下python运行from openpyxl import Workbook class ExcelMultiSheetPipeline: def __init__(self): self.file_path ./multi_sheet_data.xlsx self.wb Workbook() # 移除默认工作表 self.wb.remove(self.wb.active) self.headers [资讯标题, 访问链接, 发布时间, 内容摘要, 采集时间] # 定义工作表映射 self.sheet_map {} def open_spider(self, spider): # 预先创建两个分类工作表 category_list [科技资讯, 综合资讯] for category in category_list: ws self.wb.create_sheet(titlecategory) ws.append(self.headers) self.sheet_map[category] ws def process_item(self, item, spider): category item.get(category, ) # 根据分类选择对应工作表 ws self.sheet_map.get(category) if not ws: return item # 写入数据 row_data [ item.get(title, ), item.get(url, ), item.get(publish_time, ), item.get(summary, ), item.get(crawl_time, ) ] ws.append(row_data) return item def close_spider(self, spider): self.wb.save(self.file_path)该功能适用于多品类、多标签数据分类存储大幅提升数据可读性。5.5 openpyxl 核心原理与限制Workbook 与 Worksheet分别对应 Excel 工作簿与工作表是操作 Excel 的核心对象样式组件Font、Alignment、PatternFill 等类用于设置字体、对齐、单元格底色满足格式定制需求性能限制openpyxl 适合万条以内数据导出数据量超过五万条后内存占用会显著升高不建议用于超大批量数据场景。六、pandas 实现大数据量 Excel/CSV 导出针对十万级及以上海量数据openpyxl内存占用过高原生 CSV 管道代码冗余此时选用 pandas 库完成导出。pandas 底层做了读写优化支持内存分块、数据预处理、一键导出多格式是大数据量场景的最优选择。6.1 编写 pandas 导出管道代码实现数据缓存爬虫结束后统一通过 pandas 导出文件兼顾性能与易用性python运行import pandas as pd class PandasExportPipeline: def __init__(self): # 数据缓存列表 self.data_list [] # 导出文件路径 self.csv_path ./pandas_data.csv self.excel_path ./pandas_data.xlsx # 自定义列名 self.columns [资讯标题, 访问链接, 发布时间, 内容摘要, 分类标签, 采集时间] def process_item(self, item, spider): # 将Item转为字典存入缓存 data_dict { title: item.get(title, ), url: item.get(url, ), publish_time: item.get(publish_time, ), summary: item.get(summary, ), category: item.get(category, ), crawl_time: item.get(crawl_time, ) } self.data_list.append(data_dict) return item def close_spider(self, spider): # 将列表转为DataFrame对象 df pd.DataFrame(self.data_list) # 重命名列名 df.columns self.columns # 导出CSV文件 df.to_csv(self.csv_path, indexFalse, encodingutf-8-sig) # 导出Excel文件 df.to_excel(self.excel_path, indexFalse) spider.logger.info(fpandas导出完成CSV{self.csv_path}Excel{self.excel_path})6.2 启用管道并测试修改settings.py注册管道运行爬虫即可同时生成 CSV 与 Excel 文件python运行ITEM_PIPELINES { file_export_demo.pipelines.PandasExportPipeline: 200, }6.3 pandas 导出核心参数说明indexFalse关闭 pandas 默认行索引避免表格多出多余列encodingutf-8-sig适配 Windows 系统 Excel 软件彻底解决中文乱码DataFrame 是 pandas 核心数据结构支持筛选、去重、排序、缺失值填充等数据清洗操作可在导出前完成数据预处理。七、常见问题排查与编码、格式解决方案7.1 中文乱码问题CSV 文件打开乱码Windows 系统原因系统默认编码与文件编码不匹配。 解决方案全局配置FEED_EXPORT_ENCODING utf-8pandas 导出使用utf-8-sig编码。Excel 中文乱码原因文件写入编码未统一。 解决方案openpyxl 无编码问题pandas 导出 Excel 无需额外设置编码保持默认即可。7.2 文件重复覆盖、增量写入问题原生命令行导出无法增量写入自定义 CSV 管道使用modea追加模式可实现多次爬虫数据累加。若需要定时分割文件可在文件名中加入时间戳例如spider_20260607.csv。7.3 超大文件卡顿、内存溢出五万条以内使用 openpyxl / 自定义 CSV 管道五万至百万条优先 pandas 分批导出、CSV 格式百万条以上拆分文件按时间 / 分类生成多个子文件避免单文件体积过大。7.4 内容包含逗号、换行符导致表格错位CSV 格式以逗号作为分隔符若采集内容本身包含逗号、换行会破坏表格结构。Python 标准csv模块会自动转义特殊字符使用csv.writer写入即可规避该问题禁止手动字符串拼接生成 CSV。八、不同场景方案选型总结结合项目规模、运行环境、格式需求整理完整选型参考方便快速落地表格业务场景推荐方案核心优势临时测试、快速预览、少量数据Scrapy 命令行 -o 导出 CSV零代码、操作最快正式项目、需要增量写入、中等数据量自定义 CSV 管道轻量、高性能、无内存压力本地报表、需要格式美化、分工作表openpyxl 导出 xlsx样式丰富、支持多工作表大数据量十万条以上、需数据预处理pandas 导出 CSV/Excel读写效率高、内置数据处理能力老旧办公软件、低版本系统兼容xlwt 导出 xls 格式兼容 Excel 2003 及以下版本

相关新闻