微店作为社交电商的重要平台,其店铺全量商品接口是商家进行商品管理、库存监控和运营分析的核心工具。与单品接口相比,店铺全量商品接口具有批量处理效率高、数据维度全等特点,尤其适合店铺商品结构分析、多规格商品管理等场景。本文将系统讲解微店店铺全量商品接口的开发实现,从接口权限配置、分页递归采集到商品数据治理,结合完整代码示例,帮助开发者构建高效稳定的店铺商品数据获取体系。
一、接口特性与核心技术架构
微店店铺全量商品接口(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 格式,包含分页信息和商品列表:
二、开发环境与认证机制实现
环境配置与依赖安装
基础环境: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>