×

微店店铺全量商品接口开发实战:从批量获取到数据治理全流程​

Ace Ace 发表于2025-08-14 17:26:35 浏览59 评论0

抢沙发发表评论

微店作为社交电商的重要平台,其店铺全量商品接口是商家进行商品管理、库存监控和运营分析的核心工具。与单品接口相比,店铺全量商品接口具有批量处理效率高、数据维度全等特点,尤其适合店铺商品结构分析、多规格商品管理等场景。本文将系统讲解微店店铺全量商品接口的开发实现,从接口权限配置、分页递归采集到商品数据治理,结合完整代码示例,帮助开发者构建高效稳定的店铺商品数据获取体系。

一、接口特性与核心技术架构

微店店铺全量商品接口(weidian.shop.items.get)专为批量商品管理设计,具有以下技术特点:

    分页批量获取:支持按页批量返回店铺商品,单页最大 50 条数据

    多状态筛选:可按商品状态(在售、下架、库存不足等)精准筛选

    完整数据维度:包含基础信息、价格、库存、规格、促销等全量字段

    高效增量同步:支持按更新时间筛选,实现增量数据同步

核心参数解析



参数类别
    

具体参数
    

作用说明
    

技术约束

认证参数
    

access_token
    

访问令牌
    

OAuth2.0 授权获取,有效期 2 小时


    

sign
    

请求签名
    

MD5 加密,防止参数篡改

基础参数
    

shop_id
    

店铺 ID
    

必选,微店店铺唯一标识


    

page
    

页码
    

正整数,默认 1,最大 100


    

page_size
    

每页条数
    

10-50,默认 20

筛选参数
    

status
    

商品状态
    

0 - 全部,1 - 在售,2 - 下架,3 - 库存不足


    

start_time
    

开始时间
    

格式 yyyy-MM-dd HH:mm:ss,筛选更新时间在此之后的商品


    

end_time
    

结束时间
    

格式同上,与 start_time 配合实现增量同步

扩展参数
    

fields
    

返回字段
    

可选,指定需要返回的字段,减少数据传输量


    

with_spec
    

是否返回规格
    

0 - 不返回,1 - 返回,默认 1



响应数据结构

接口返回采用 JSON 格式,包含分页信息和商品列表:
00a49b751a854731a5708e58d01c80ff.png

点击获取key和secret

二、开发环境与认证机制实现

环境配置与依赖安装

    基础环境:Python 3.8+

    核心依赖:





    开发工具:VS Code(推荐安装 Python、REST Client 插件)

    调试工具:微店开放平台调试工具、Postman

签名与认证工具实现





三、核心接口开发实现

店铺商品 API 客户端





# 错误处理

if result.get("errcode") != 0:

logging.error(f"接口错误: {result.get('errmsg')} (错误码: {result.get('errcode')})")

# 处理令牌过期等需要重试的错误

if result.get("errcode") in [40001, 40003] and retry < self.max_retries - 1:

time.sleep(self.retry_delay * (retry + 1))

continue

return None



return result



except requests.exceptions.RequestException as e:

logging.warning(f"请求异常 (重试 {retry+1}/{self.max_retries}): {str(e)}")

if retry < self.max_retries - 1:

time.sleep(self.retry_delay * (retry + 1)) # 指数退避

except json.JSONDecodeError as e:

logging.error(f"响应解析错误: {str(e)}")

return None



logging.error(f"达到最大重试次数,获取店铺 {shop_id} 商品失败")

return None



全量商品采集器



fields=fields

)



if not first_page or "items" not in first_page:

logging.error("首次请求失败,无法获取商品数据")

return pd.DataFrame(), stats



# 提取统计信息

stats["total_count"] = first_page.get("total_count", 0)

stats["total_page"] = first_page.get("total_page", 0)

all_items.extend(first_page["items"])

stats["success_count"] = len(first_page["items"])



# 确定需要采集的总页数

total_pages = stats["total_page"]

if max_pages and total_pages > max_pages:

total_pages = max_pages



if total_pages <= 1:

df = pd.DataFrame(all_items)

return df, stats



# 采集剩余页数

for page in tqdm(range(2, total_pages + 1), desc=f"采集店铺 {shop_id} 商品"):

page_data = self.client.get_shop_items(

shop_id=shop_id,

access_token=access_token,

page=page,

page_size=page_size,

status=status,

start_time=start_time,

end_time=end_time,

fields=fields

)



if not page_data or "items" not in page_data:

logging.warning(f"第 {page} 页数据获取失败,已跳过")

continue



all_items.extend(page_data["items"])

stats["success_count"] += len(page_data["items"])



# 控制请求频率,避免触发限流

time.sleep(1)



# 转换为DataFrame

df = pd.DataFrame(all_items)





四、商品数据处理与解析

规格数据解析工具



"""

specs_list = []

skus_list = []



if "spec_info" not in items_df.columns:

return pd.DataFrame(), pd.DataFrame()



for _, row in items_df.iterrows():

item_id = row.get("item_id")

spec_info = row.get("spec_info", {})



# 解析规格维度

for spec in spec_info.get("specs", []):

spec_id = spec.get("spec_id")

spec_name = spec.get("spec_name")



for val in spec.get("spec_values", []):

specs_list.append({

"item_id": item_id,

"spec_id": spec_id,

"spec_name": spec_name,

"value_id": val.get("value_id"),

"value_name": val.get("value_name"),

"value_image": val.get("image")

})



商品数据清洗与标准化



def clean_shop_item_data(df: pd.DataFrame) -> pd.DataFrame:

"""

清洗店铺商品数据

:param df: 原始商品DataFrame

:return: 清洗后的DataFrame

"""

if df.empty:

return df



df_clean = df.copy()



# 1. 去重(根据item_id)

df_clean = df_clean.drop_duplicates(subset=["item_id"], keep="last")



# 2. 处理缺失值

# 填充价格缺失值(用市场价代替)

if "price" in df_clean.columns and "market_price" in df_clean.columns:

price_mask = df_clean["price"].isna() & ~df_clean["market_price"].isna()

df_clean.loc[price_mask, "price"] = df_clean.loc[price_mask, "market_price"]



# 填充库存缺失值(默认0)

if "stock" in df_clean.columns:</doubaocanvas>

群贤毕至

访客