你需要一份完整的 Python 实战指南,实现「采集淘宝商品详情 + 数据整理 + 生成 Excel 报表」的全流程,核心是在之前批量采集的基础上,新增 Excel 生成功能,同时保证报表格式整洁、数据完整,适合新手直接落地。
这份指南会基于多线程采集方案(入门友好),整合 openpyxl 库(处理 Excel 最佳实践之一,支持 xlsx 格式,可自定义单元格样式),完成从数据采集到报表输出的闭环。
Python 采集淘宝商品详情并生成 Excel 报表
前置说明
- 核心依赖:在之前采集环境的基础上,新增处理 Excel 的
openpyxl库(支持创建、编辑 xlsx 格式文件,自定义样式)。 - 前置准备:已获取淘宝开放平台
AppKey/AppSecret、接口权限、配置 IP 白名单(参考之前的入门指南)。 - 全流程目标:批量采集商品详情 → 整理结构化数据 → 生成规范 Excel 报表(含表头、数据、简单样式优化)。
- 合规提醒:仍需严格遵守淘宝 API 调用限制,禁止高频违规采集,数据仅用于合法场景。
安装新增依赖
bash
运行
pip install openpyxl # 核心 Excel 处理库
完整实战代码
这份代码整合了「多线程批量采集」和「Excel 报表生成」,包含详细注释,新手可直接复制修改后运行。
python
运行
from topapi import TopApiClient from topapi.api import TaobaoItemGetRequest from concurrent.futures import ThreadPoolExecutor, as_completed import time from openpyxl import Workbook from openpyxl.styles import Font, Alignment, PatternFill, Border, Side # ---------------------- 全局配置项(替换为你自己的信息)---------------------- APP_KEY = "你的AppKey" APP_SECRET = "你的AppSecret" SESSION_KEY = "" # 公开接口留空即可 # 待采集的商品 num_iid 列表(可自行补充) ITEM_NUM_IID_LIST = ["123456789", "987654321", "112233445"] # 多线程配置 THREAD_POOL_SIZE = 5 REQUEST_DELAY = 0.5 # Excel 报表配置 EXCEL_FILENAME = "淘宝商品详情报表.xlsx" # Excel 表头配置(列名 → 对应商品数据的 key) EXCEL_HEADERS = { "商品ID": "num_iid", "商品标题": "title", "商品价格(元)": "price", "商品类目": "cat_name", "商品品牌": "brand_name", "主图链接": "pic_url" } # ---------------------- 1. 工具函数:初始化淘宝 API 客户端---------------------- def init_taobao_client(): """初始化 TopApi 客户端,返回客户端实例""" try: client = TopApiClient( appkey=APP_KEY, appsecret=APP_SECRET, sessionkey=SESSION_KEY ) print("✅ API 客户端初始化成功") return client except Exception as e: print(f"❌ 客户端初始化失败:{str(e)}") return None # ---------------------- 2. 工具函数:采集单个商品详情---------------------- def get_single_item_detail(client, num_iid): """ 采集单个商品的基础详情数据,返回结构化字典 :param client: TopApi 客户端实例 :param num_iid: 商品 ID :return: 商品数据字典(采集失败返回 None) """ if not client or not num_iid: return None # 添加请求延迟,避免触发 API 限流 time.sleep(REQUEST_DELAY) try: # 构造 API 请求 req = TaobaoItemGetRequest() req.num_iid = num_iid # 指定返回字段,与 EXCEL_HEADERS 对应,减少冗余数据 req.fields = ",".join(EXCEL_HEADERS.values()) # 发起请求并获取响应 resp = client.execute(req) # 解析响应数据 if resp.get("code") == 0: item_data = resp.get("item", {}) # 提取核心字段,返回与表头对应的结构化数据 result = { "num_iid": item_data.get("num_iid", num_iid), "title": item_data.get("title", "无标题"), "price": item_data.get("price", "0.00"), "cat_name": item_data.get("cat_name", "无类目"), "brand_name": item_data.get("brand_name", "无品牌"), "pic_url": item_data.get("pic_url", "无主图链接") } print(f"✅ 采集成功:{num_iid} - {result['title'][:20]}...") return result else: print(f"❌ 采集失败 {num_iid}:{resp.get('msg')}(错误码:{resp.get('code')})") return None except Exception as e: print(f"❌ 采集异常 {num_iid}:{str(e)}") return None # ---------------------- 3. 工具函数:多线程批量采集商品数据---------------------- def batch_collect_item_data(client, item_num_iid_list): """ 多线程批量采集商品详情数据,返回采集成功的数据集 :param client: TopApi 客户端实例 :param item_num_iid_list: 商品 ID 列表 :return: 成功采集的商品数据列表 """ if not client or not item_num_iid_list: return [] start_time = time.time() success_data = [] # 创建线程池并提交任务 with ThreadPoolExecutor(max_workers=THREAD_POOL_SIZE) as executor: # 建立「未来对象 - 商品 ID」映射,便于后续关联结果 future_to_num_iid = { executor.submit(get_single_item_detail, client, num_iid): num_iid for num_iid in item_num_iid_list } # 遍历已完成的任务,收集成功结果 for future in as_completed(future_to_num_iid): try: item_result = future.result() if item_result: success_data.append(item_result) except Exception as e: num_iid = future_to_num_iid[future] print(f"❌ 任务执行异常 {num_iid}:{str(e)}") # 打印采集统计信息 end_time = time.time() print(f"\n📊 批量采集完成!总耗时:{end_time - start_time:.2f} 秒") print(f"📊 成功采集:{len(success_data)} / {len(item_num_iid_list)} 个商品") return success_data # ---------------------- 4. 工具函数:生成 Excel 报表---------------------- def generate_excel_report(item_data_list, filename=EXCEL_FILENAME): """ 将采集的商品数据生成 Excel 报表,支持简单样式优化 :param item_data_list: 成功采集的商品数据列表 :param filename: Excel 报表文件名 :return: 生成成功返回 True,失败返回 False """ if not item_data_list: print("❌ 无有效商品数据,无法生成 Excel 报表") return False try: # 1. 创建一个新的 Excel 工作簿 wb = Workbook() ws = wb.active # 获取当前活跃的工作表(默认第一个工作表) ws.title = "商品详情数据" # 设置工作表名称 # 2. 定义 Excel 样式(提升报表美观度) # 表头样式:加粗、居中、浅蓝色背景、黑色边框 header_font = Font(bold=True, color="000000") header_alignment = Alignment(horizontal="center", vertical="center") header_fill = PatternFill(start_color="E6F3FF", end_color="E6F3FF", fill_type="solid") border = Border( left=Side(style="thin", color="CCCCCC"), right=Side(style="thin", color="CCCCCC"), top=Side(style="thin", color="CCCCCC"), bottom=Side(style="thin", color="CCCCCC") ) # 3. 写入表头 header_names = list(EXCEL_HEADERS.keys()) for col, header_name in enumerate(header_names, start=1): cell = ws.cell(row=1, column=col, value=header_name) # 应用表头样式 cell.font = header_font cell.alignment = header_alignment cell.fill = header_fill cell.border = border # 4. 写入商品数据 for row, item_data in enumerate(item_data_list, start=2): for col, (_, data_key) in enumerate(EXCEL_HEADERS.items(), start=1): cell_value = item_data.get(data_key, "") cell = ws.cell(row=row, column=col, value=cell_value) # 应用数据单元格样式(居中、边框) cell.alignment = Alignment(horizontal="left", vertical="center") cell.border = border # 5. 调整列宽(自适应内容,提升可读性) for col in range(1, len(header_names) + 1): # 不同列设置不同基础宽度,适配内容 if col == 2: # 商品标题列,设置较宽 ws.column_dimensions[chr(64 + col)].width = 50 elif col == 6: # 主图链接列,设置较宽 ws.column_dimensions[chr(64 + col)].width = 60 else: ws.column_dimensions[chr(64 + col)].width = 20 # 6. 保存 Excel 文件 wb.save(filename) print(f"\n✅ Excel 报表生成成功!文件路径:{filename}") return True except Exception as e: print(f"❌ Excel 报表生成失败:{str(e)}") return False # ---------------------- 主函数:整合全流程---------------------- if __name__ == "__main__": # 步骤 1:初始化淘宝 API 客户端 taobao_client = init_taobao_client() if not taobao_client: exit(1) # 步骤 2:多线程批量采集商品数据 collected_item_data = batch_collect_item_data(taobao_client, ITEM_NUM_IID_LIST) if not collected_item_data: exit(1) # 步骤 3:生成 Excel 报表 generate_excel_report(collected_item_data, EXCEL_FILENAME)
代码关键说明
1. 核心模块分工
全流程分为 4 个核心工具函数,职责清晰,便于新手理解和修改:
init_taobao_client():初始化 API 客户端,为采集做准备。get_single_item_detail():采集单个商品数据,返回结构化字典。batch_collect_item_data():多线程批量采集,收集所有成功数据。generate_excel_report():将采集数据写入 Excel,优化报表样式。
2. Excel 处理核心要点(openpyxl 用法)
- 工作簿与工作表:
Workbook()创建新工作簿,wb.active获取默认工作表,ws.title修改工作表名称。 - 数据写入:
ws.cell(row=行号, column=列号, value=值)写入单个单元格,行号 / 列号从 1 开始(符合 Excel 操作习惯)。 - 样式优化:通过
Font(字体)、Alignment(对齐)、PatternFill(背景色)、Border(边框)优化报表美观度,避免生成无格式的原始表格。 - 列宽调整:
ws.column_dimensions[列字母].width调整列宽,针对标题、链接等长内容列设置更大宽度,提升可读性。 - 文件保存:
wb.save(filename)保存为 xlsx 格式文件,直接在代码运行目录生成。
3. 关键配置优化
EXCEL_HEADERS映射:表头名称与商品数据 key 一一对应,方便后续修改表头或调整返回字段,无需大面积改动代码。- 请求字段与表头对应:
req.fields直接使用EXCEL_HEADERS的 value 列表,减少冗余数据传输,提升采集效率。 - 列宽自适应:针对不同列的内容长度设置不同基础宽度,避免出现「内容被遮挡」的问题。
运行步骤与效果
1. 运行步骤
- 替换配置项中的
APP_KEY、APP_SECRET、ITEM_NUM_IID_LIST为你自己的信息。 - 将代码保存为
taobao_item_excel.py。 - 打开终端,进入代码保存目录,执行命令:bash
运行
python taobao_item_excel.py
- 等待采集完成,终端会打印采集统计和 Excel 生成结果。
2. 运行效果
- 终端输出:依次打印「客户端初始化成功」「单个商品采集成功」「批量采集统计」「Excel 报表生成成功」。
- 文件生成:在代码运行目录下,会生成名为「淘宝商品详情报表.xlsx」的文件。
- Excel 内容:
- 工作表名称为「商品详情数据」。
- 第一行为表头,加粗、居中、浅蓝色背景。
- 后续行为商品数据,包含商品 ID、标题、价格等信息,带边框,列宽适配内容。
- 可直接用 Excel、WPS 打开编辑,支持筛选、排序等后续操作。
常见问题排查
| 问题现象 | 常见原因 | 解决方案 |
| Excel 报表生成失败,提示「No module named 'openpyxl'」 | openpyxl 库未安装成功 |
重新执行 pip install openpyxl,检查终端安装提示 |
| Excel 中无数据,仅表头 | 采集的商品数据为空,或数据 key 与表头映射不匹配 | 1. 检查采集是否成功(终端打印的成功数量)2. 核对 EXCEL_HEADERS 的 value 与商品数据 key 一致 |
| 商品标题被截断 | Excel 列宽不足 | 修改 generate_excel_report() 中的列宽配置,增大商品标题列(第 2 列)的宽度 |
| Excel 打开提示「文件损坏」 | 保存文件时出现异常(如权限不足、文件被占用) | 1. 关闭已打开的同名 Excel 文件2. 检查代码运行目录是否有写入权限3. 更换 Excel 文件名重新运行 |
| 采集成功但 Excel 中部分字段为空 | 商品本身无该字段数据,或 API 未返回该字段 | 1. 核对 req.fields 中是否包含该字段2. 检查商品详情页是否有该信息(如部分商品无品牌) |
进阶优化方向(落地必备)
- 添加数据筛选:生成 Excel 前,对采集数据进行去重、过滤(如过滤价格为 0 的商品)。
- 支持更多字段:扩展
EXCEL_HEADERS和req.fields,添加商品短卖点、库存等信息。 - 批量导出多个工作表:按商品类目拆分不同工作表,便于分类管理。
- 添加 Excel 公式:在 Excel 中添加总价计算、价格排序等公式,提升报表实用性。
- 异常重试与断点续采:若采集中途失败,支持从断点继续采集,避免重复工作,同时将失败的商品 ID 单独写入 Excel 工作表。
总结
核心要点回顾
- 全流程核心是「批量采集结构化数据 → 映射到 Excel 表头 → 写入并优化样式」,闭环落地无额外复杂操作。
- 新手快速上手的关键:使用
ThreadPoolExecutor实现多线程采集,使用openpyxl实现 Excel 生成,二者均封装完善,无需深入底层。 - Excel 报表的实用性提升:通过表头映射、样式优化、列宽自适应,让生成的报表整洁、可直接用于后续分析。
- 合规与避坑:始终控制 API 调用频次避免限流,Excel 生成前检查数据有效性避免文件损坏。
- 核心依赖库:
topapi(采集)、concurrent.futures(多线程)、openpyxl(Excel 处理),三者搭配满足从采集到报表的全部需求。
这份代码可直接用于小规模商品详情采集与报表生成,后续可根据实际需求扩展功能,提升实用性和健壮性。