亚马逊到店匠格式转换分析.md
10.1 KB
亚马逊格式到店匠格式转换 - 核心工作内容分析
一、概述
本项目实现了从亚马逊格式Excel数据到店匠(Shoplazza)商品导入模板的格式转换,主要处理商品的多款式(变体)结构和属性字段映射。
核心脚本:scripts/amazon_xlsx_to_shoplazza_xlsx.py
二、父子款式处理(M/P/S 结构转换)
2.1 输入格式(亚马逊)
- ASIN:变体ID(SKU级别)
- 父ASIN:父商品ID(SPU级别)
- 一个父ASIN可以包含多个ASIN(多个变体)
2.2 输出格式(店匠)
店匠模板定义了三种商品属性类型:
S(单一款式):只有一个变体的商品
- 输出:1行
- 包含所有商品信息(标题、价格、库存等)
M(主商品)+ P(子款式):包含多个变体的商品
- 输出:1行M + N行P
- 关键约束:同一商品的P行必须紧跟在M行后面(模板导入强约束)
2.3 转换策略
# 核心逻辑(简化版)
for 父ASIN in 所有父ASIN:
variants = 获取该父ASIN下的所有ASIN
if len(variants) == 1:
生成 S 行(单一款式)
else:
生成 M 行(主商品)+ 多个 P 行(子款式)
2.4 关键处理点
1. 父ASIN排序
- 确保父ASIN对应的变体在列表最前面
- 如果找不到父ASIN对应的变体,根据配置决定是否丢弃整个SPU
2. 标题一致性检查
- 同一SPU下的所有变体标题必须一致
- 如果发现不一致:
- 选项1:丢弃标题不一致的SKU(默认)
- 选项2:修正为统一的主商品标题
3. M行与P行的字段分工
M行(主商品)填写:
- ✅ 商品标题、描述、SEO信息
- ✅ 专辑、标签、供应商信息
- ✅ 商品主图
- ✅ 款式维度名(款式1/2/3的key)
- ❌ 不填:价格、库存、重量等SKU级字段(保持为空更安全)
P行(子款式)填写:
- ✅ 商品标题(与M行一致)
- ✅ 款式维度值(款式1/2/3的value)
- ✅ 价格、商品SKU(ASIN)、库存
- ✅ 重量、尺寸
- ✅ 子款式图(可选)
- ❌ 不填:描述、SEO、专辑等SPU级字段(保持为空)
三、属性字段处理(款式维度解析)
3.1 问题背景
亚马逊格式中,变体的"颜色/尺码"等信息并不拆成多个列,而是集中在 SKU 字符串里:
示例1: "Size: One Size | Color: Black"
示例2: "Color: Red | Style: 2-Pack"
而店匠模板需要:
- M行:
款式1/款式2/款式3填写维度名(如 Size、Color、Material) - P行:
款式1/款式2/款式3填写维度值(如 One Size、Black、Cotton)
3.2 SKU解析逻辑
def parse_sku_options(sku_text):
"""
解析 SKU 列,提取 key:value 对
输入: "Size: One Size | Color: Black"
输出: {"Size": "One Size", "Color": "Black"}
"""
# 1. 按 | 分割
parts = sku_text.split("|")
# 2. 按 : 拆成 key/value
for part in parts:
if ":" in part:
key, value = part.split(":", 1)
result[key.strip()] = value.strip()
return result
3.3 维度选择策略(最多3个维度)
店匠模板只提供 款式1~3 三个维度,因此需要从多个变体中智能选择最多3个维度:
优先级规则
按预设优先级排序:
PREFERRED_OPTION_KEYS = [ "Size", "Color", "Style", "Pattern", "Material", "Flavor", "Scent", "Pack", "Pack of", ... ]按出现频次排序:统计每个key在所有变体中的出现次数
综合排序:
def key_sort(k): return ( 预设优先级(越小越优先), -出现频次(越大越优先), 字母顺序(作为最后排序依据) )
退化处理
如果解析不到任何 key/value,则退化为单维度:
- M行:
款式1 = "Variant" - P行:
款式1 = ASIN(使用ASIN作为维度值)
3.4 维度映射示例
输入数据(3个变体):
变体1: SKU = "Size: S | Color: Red"
变体2: SKU = "Size: M | Color: Red"
变体3: SKU = "Size: S | Color: Blue"
解析结果:
- 维度统计:Size出现3次,Color出现3次
- 选择维度:Size(优先级1)、Color(优先级2)
- 最多3个,所以选择前2个
输出格式:
M行:
款式1 = "Size"
款式2 = "Color"
款式3 = ""
P行1:
款式1 = "S"
款式2 = "Red"
款式3 = ""
P行2:
款式1 = "M"
款式2 = "Red"
款式3 = ""
P行3:
款式1 = "S"
款式2 = "Blue"
款式3 = ""
四、字段映射总览
4.1 核心字段映射
| 店匠字段 | 亚马逊字段 | 处理逻辑 |
|---|---|---|
| 商品spu | 父ASIN |
无父ASIN则用ASIN |
| 商品SKU | ASIN |
直接映射 |
| 商品标题* | 商品标题 |
截断至255字符 |
| 商品图片* | 商品主图 |
URL直接映射 |
| 商品售价* | prime价格($) 或 价格($) |
优先prime价格 |
| 创建时间 | 上架时间 |
日期格式转换(补齐时分秒) |
| 商品描述 | 商品标题 + 详细参数 |
HTML拼接 |
| 专辑名称 | 大类目 |
无则取类目路径第一段 |
| 标签 | 品牌,大类目,小类目 |
逗号拼接 |
| 商品重量/重量单位 | 商品重量(单位换算) |
解析数值和单位(g/kg/lb/oz) |
| 尺寸信息 | 商品尺寸 |
解析前三段数字,拼成 L,W,H(英寸) |
4.2 特殊字段处理
1. 价格处理
price = prime价格($) or 价格($) or 9.99 # 默认值9.99
2. 库存处理
- 亚马逊数据源通常没有库存
- 脚本默认给每个变体固定库存:100
3. 日期格式转换
输入: "2018-05-09" 或 datetime对象
输出: "2018-05-09 00:00:00" # 补齐时分秒
4. 重量解析
输入: "68.04 g" 或 "0.15 pounds"
输出: (68.04, "g") 或 (0.15, "lb")
5. 尺寸解析
输入: "7.9 x 7.9 x 2 inches"
输出: "7.9,7.9,2" # L,W,H格式
6. SEO URL Handle生成
输入: "Legendary Whitetails Men's Buck Camp Flannel Shirt"
输出: "products/legendary-whitetails-mens-buck-camp-flannel-shirt"
# 规则:转小写、去特殊字符、空格转横线
五、重要工作内容总结
5.1 数据结构转换
- 父子关系识别:从扁平化的ASIN列表识别出SPU-SKU层级关系
- 分组策略:按父ASIN分组,决定生成S还是M+P结构
- 行序保证:确保同一SPU的M+P行连续,不被打断
5.2 属性字段解析
- SKU字符串解析:从非结构化字符串中提取key:value对
- 维度智能选择:从多个可能的维度中选择最重要的3个
- 优先级算法:综合考虑预设优先级、出现频次、字母顺序
5.3 字段映射与转换
- 格式转换:日期、价格、重量、尺寸等格式标准化
- 默认值填充:库存、价格等缺失字段的默认值策略
- 数据清洗:标题截断、HTML转义、URL生成等
5.4 数据质量控制
- 标题一致性检查:确保同一SPU下所有变体标题一致
- 父ASIN验证:检查父ASIN是否存在于变体列表中
- 错误处理:提供配置选项决定是修正还是丢弃异常数据
5.5 性能优化
- 批量处理:支持多文件批量转换
- 文件拆分:按最大行数自动拆分输出文件(保证同一SPU不拆分)
- 快速读写:使用
iter_rows(values_only=True)和write_only模式提升性能
六、关键技术难点
6.1 维度选择算法
挑战:从多个变体的SKU字符串中,智能选择最重要的3个维度
解决方案:
- 统计所有变体中每个key的出现频次
- 结合预设优先级列表(Size > Color > Style > ...)
- 综合排序选择前3个
6.2 数据一致性保证
挑战:确保同一SPU下的所有变体数据一致
解决方案:
- 标题一致性检查和修正
- 父ASIN排序保证
- M行和P行的字段分工明确
6.3 文件拆分策略
挑战:按最大行数拆分文件,但不能拆分同一SPU
解决方案:
- 先按SPU分组生成所有行
- 拆分时以SPU为单位,不拆分单个SPU的行
七、扩展点
7.1 可配置项
- 库存默认值(当前100)
- 价格默认值(当前9.99)
- 上架/收税/物流策略(当前硬编码Y/N)
7.2 可增强功能
- 更强的多款式解析:如果SKU字段不规范,可从
详细参数中提取Color/Size - 图片策略优化:P行可改为使用M行合并的多图(逗号拼接)
- 元字段支持:支持店匠的元字段导入
八、使用示例
8.1 小批量验证
python scripts/amazon_xlsx_to_shoplazza_xlsx.py \
--input-dir data/mai_jia_jing_ling/products_data \
--template docs/商品导入模板.xlsx \
--output data/mai_jia_jing_ling/amazon_shoplazza_import_SAMPLE.xlsx \
--max-files 1 --max-products 50
8.2 全量转换
python scripts/amazon_xlsx_to_shoplazza_xlsx.py \
--input-dir data/mai_jia_jing_ling/products_data \
--template docs/商品导入模板.xlsx \
--output data/mai_jia_jing_ling/amazon_shoplazza_import_ALL.xlsx
8.3 自动拆分文件
python scripts/amazon_xlsx_to_shoplazza_xlsx.py \
--input-dir data/mai_jia_jing_ling/products_data \
--template docs/商品导入模板.xlsx \
--output data/mai_jia_jing_ling/amazon_shoplazza_import_SPLIT.xlsx \
--max-rows-per-output 40000
九、总结
亚马逊格式到店匠格式的转换,核心工作包括:
- 父子款式结构转换:从ASIN/父ASIN关系转换为M/P/S结构
- 属性字段解析:从SKU字符串中提取并智能选择款式维度
- 字段映射与转换:40+个字段的格式转换和默认值处理
- 数据质量控制:一致性检查、错误处理、数据清洗
- 性能优化:批量处理、文件拆分、快速读写
这是一个典型的数据格式转换ETL任务,涉及数据结构重组、字符串解析、智能算法选择等多个技术领域。