亚马逊到店匠格式转换分析.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 输出格式(店匠)

店匠模板定义了三种商品属性类型:

  1. S(单一款式):只有一个变体的商品

    • 输出:1行
    • 包含所有商品信息(标题、价格、库存等)
  2. 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个维度

优先级规则

  1. 按预设优先级排序

    PREFERRED_OPTION_KEYS = [
       "Size", "Color", "Style", "Pattern", "Material", 
       "Flavor", "Scent", "Pack", "Pack of", ...
    ]
    
  2. 按出现频次排序:统计每个key在所有变体中的出现次数

  3. 综合排序

    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 数据结构转换

  1. 父子关系识别:从扁平化的ASIN列表识别出SPU-SKU层级关系
  2. 分组策略:按父ASIN分组,决定生成S还是M+P结构
  3. 行序保证:确保同一SPU的M+P行连续,不被打断

5.2 属性字段解析

  1. SKU字符串解析:从非结构化字符串中提取key:value对
  2. 维度智能选择:从多个可能的维度中选择最重要的3个
  3. 优先级算法:综合考虑预设优先级、出现频次、字母顺序

5.3 字段映射与转换

  1. 格式转换:日期、价格、重量、尺寸等格式标准化
  2. 默认值填充:库存、价格等缺失字段的默认值策略
  3. 数据清洗:标题截断、HTML转义、URL生成等

5.4 数据质量控制

  1. 标题一致性检查:确保同一SPU下所有变体标题一致
  2. 父ASIN验证:检查父ASIN是否存在于变体列表中
  3. 错误处理:提供配置选项决定是修正还是丢弃异常数据

5.5 性能优化

  1. 批量处理:支持多文件批量转换
  2. 文件拆分:按最大行数自动拆分输出文件(保证同一SPU不拆分)
  3. 快速读写:使用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

九、总结

亚马逊格式到店匠格式的转换,核心工作包括:

  1. 父子款式结构转换:从ASIN/父ASIN关系转换为M/P/S结构
  2. 属性字段解析:从SKU字符串中提取并智能选择款式维度
  3. 字段映射与转换:40+个字段的格式转换和默认值处理
  4. 数据质量控制:一致性检查、错误处理、数据清洗
  5. 性能优化:批量处理、文件拆分、快速读写

这是一个典型的数据格式转换ETL任务,涉及数据结构重组、字符串解析、智能算法选择等多个技术领域。