如何通过Product与ProductSize两个类重构Python商品抓取代码?
电商商品抓取代码拆分类改造方案
现有代码问题
- 已用
attr实现ProductPage类,商品尺寸以字典类型存在sizes字段,属于JS式弱结构写法,无类型约束、易出现键名拼写错误
改造要求落地规则
- 拆分为两个独立业务类:
ProductSize(尺寸维度)、Product(商品维度,可替代原ProductPage的核心业务逻辑) ProductSize需满足:- 用dataclass实现
- 含
name(尺寸名)、link(对应商品链接)、quantity(库存数)三个字段 - 实现接收原始字典、返回类实例的
classmethod构造器 - 商品尺寸用
ProductSize实例列表存储,而非字典
具体改造步骤
- 定义
ProductSizedataclass(含字典转换构造器)
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)) )
- 重构商品类(原
ProductPage调整为Product,尺寸字段改为实例列表)
import attr from typing import List @attr.s(auto_attribs=True) class Product: # 保留原商品基础字段(标题、价格等) title: str price: float # 原`sizes`字典字段替换为ProductSize实例列表 sizes: List[ProductSize]
- 抓取数据后批量转换实例
# 假设抓取到的原始商品数据 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
相关产品推荐
相关产品推荐

