You need to enable JavaScript to run this app. 如何通过Product与ProductSize两个类重构Python商品抓取代码?
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Product与ProductSize两个类重构Python商品抓取代码?

电商商品抓取代码拆分类改造方案

现有代码问题

  • 已用attr实现ProductPage类,商品尺寸以字典类型存在sizes字段,属于JS式弱结构写法,无类型约束、易出现键名拼写错误

改造要求落地规则

  • 拆分为两个独立业务类:ProductSize(尺寸维度)、Product(商品维度,可替代原ProductPage的核心业务逻辑)
  • ProductSize需满足:
    • 用dataclass实现
    • 含name(尺寸名)、link(对应商品链接)、quantity(库存数)三个字段
    • 实现接收原始字典、返回类实例的classmethod构造器
    • 商品尺寸用ProductSize实例列表存储,而非字典

具体改造步骤

  1. 定义ProductSize dataclass(含字典转换构造器)
from dataclasses import dataclass
from typing import Dict

@dataclass
class ProductSize:
    name: str
    link: str
    quantity: int

    @classmethod
    def from_raw(cls, raw_size: Dict) -> "ProductSize":
        # 此处可根据实际抓取的原始字典键名调整映射逻辑
        return cls(
            name=raw_size.get("size_name", ""),
            link=raw_size.get("size_href", ""),
            quantity=int(raw_size.get("stock", 0))
        )
  1. 重构商品类(原ProductPage调整为Product,尺寸字段改为实例列表)
import attr
from typing import List

@attr.s(auto_attribs=True)
class Product:
    # 保留原商品基础字段(标题、价格等)
    title: str
    price: float
    # 原`sizes`字典字段替换为ProductSize实例列表
    sizes: List[ProductSize]
  1. 抓取数据后批量转换实例
# 假设抓取到的原始商品数据
raw_prod = {
    "title": "休闲牛仔裤",
    "price": 199.0,
    "size_list": [
        {"size_name": "28码", "size_href": "xxx/28", "stock": 3},
        {"size_name": "29码", "size_href": "xxx/29", "stock": 8}
    ]
}

# 组装Product实例
product = Product(
    title=raw_prod["title"],
    price=raw_prod["price"],
    # 批量将原始字典转为ProductSize实例
    sizes=[ProductSize.from_raw(s) for s in raw_prod["size_list"]]
)

改造后的收益

  • 字段有明确类型注解,IDE支持自动补全、静态检查
  • 避免字典键名拼写错误(如size["nmae"]这类低级问题)
  • 业务逻辑可扩展(如给ProductSize加is_oos方法判断是否缺货)

内容的提问来源于stack exchange,提问作者PythonNewbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.23 11:06:04