1688 item_search_shop 接口深度分析及 Python 实现

简介: 1688的item_search_shop接口可获取指定店铺商品信息,适用于电商数据分析、竞品监控、供应链管理等场景。支持分页、排序,需通过appkey+签名认证。本文提供Python调用示例及使用注意事项。

1688 的 item_search_shop 接口是阿里巴巴开放平台提供的重要接口,用于获取指定店铺的所有商品信息。该接口对于电商数据分析、竞品监控、供应链管理等场景具有重要价值,能够帮助开发者批量获取店铺商品的详细数据。
一、接口核心特性分析

  1. 接口功能与定位
    功能:获取指定 1688 店铺内的商品列表及详情信息
    应用场景:
    竞品分析:监控竞争对手店铺的商品结构和价格策略
    供应链管理:批量获取供应商店铺的商品信息
    电商代运营:帮助商家管理多个店铺的商品数据
    数据分析:分析特定行业或类目下的商品趋势
  2. 接口认证机制
    1688 开放平台采用 appkey + 签名 的认证方式,具体流程如下:
    开发者在 1688 开放平台注册应用,获取 appkey 和 appsecret
    每次请求时,将所有参数按规则排序并生成签名
    签名与参数一同发送,1688 服务器验证签名有效性
  3. 核心参数与响应结构
    请求参数
    参数名 类型 是否必填 说明
    method String 是 接口方法名,固定为 alibaba.item.search.shop
    app_key String 是 应用的 appkey
    timestamp String 是 时间戳,格式为 yyyy-MM-dd HH:mm:ss
    format String 否 响应格式,默认 json
    v String 是 接口版本,固定为 2.0
    sign String 是 签名
    shop_id String 是 店铺 ID
    page Number 否 页码,默认 1
    page_size Number 否 每页条数,默认 40,最大 100
    sort String 否 排序方式,如 price_asc 按价格升序
    响应结构
    响应主要包含以下几个部分:
    分页信息:总页数、当前页、总商品数
    商品列表:每个商品包含基础信息、价格、库存、销量等
    店铺信息:店铺名称、信用等级、主营类目等
    二、Python 脚本实现
    下面是调用 item_search_shop 接口的完整 Python 实现,包含签名生成、接口调用、数据解析等功能:
    import requests
    import hashlib
    import time
    import json
    import logging
    from typing import Dict, Optional, List
    from requests.exceptions import RequestException

    配置日志
    logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s"
    )

class AlibabaItemSearchShopAPI:
def init(self, appkey: str, appsecret: str):
"""
初始化1688 item_search_shop接口客户端
:param appkey: 1688开放平台appkey
:param appsecret: 1688开放平台appsecret
"""
self.appkey = appkey
self.appsecret = appsecret
self.base_url = "https://gw.open.1688.com/openapi/http/1/system.oauth2"
self.session = requests.Session()

def _generate_sign(self, params: Dict) -> str:
    """生成1688 API签名"""
    # 1. 按参数名ASCII升序排序
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    # 2. 拼接为key=value&key=value格式
    sign_str = "&".join([f"{k}={v}" for k, v in sorted_params])
    # 3. 拼接appsecret并MD5加密
    sign_str += self.appsecret
    return hashlib.md5(sign_str.encode()).hexdigest().upper()

def _get_timestamp(self) -> str:
    """生成时间戳(yyyy-MM-dd HH:mm:ss)"""
    return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

def get_shop_items(self, shop_id: str, page: int = 1, page_size: int = 40, 
                   sort: Optional[str] = None) -> Optional[Dict]:
    """
    获取店铺商品列表
    :param shop_id: 店铺ID
    :param page: 页码
    :param page_size: 每页数量
    :param sort: 排序方式
    :return: 商品列表数据
    """
    # 构造请求参数
    params = {
        "method": "alibaba.item.search.shop",
        "app_key": self.appkey,
        "timestamp": self._get_timestamp(),
        "format": "json",
        "v": "2.0",
        "shop_id": shop_id,
        "page": str(page),
        "page_size": str(page_size)
    }

    # 添加可选的排序参数
    if sort:
        params["sort"] = sort

    # 生成签名
    params["sign"] = self._generate_sign(params)

    try:
        # 发送请求
        response = self.session.get(
            self.base_url,
            params=params,
            timeout=15
        )
        response.raise_for_status()
        result = response.json()

        # 处理错误响应
        if "error_response" in result:
            error = result["error_response"]
            logging.error(f"接口错误:{error.get('msg', '未知错误')}(错误码:{error.get('code', '未知')})")
            return None

        # 提取并格式化商品数据
        return self._format_response(result)

    except RequestException as e:
        logging.error(f"请求异常:{str(e)}")
        return None
    except json.JSONDecodeError:
        logging.error(f"响应解析失败:{response.text[:200]}...")
        return None

def _format_response(self, response: Dict) -> Dict:
    """格式化响应数据"""
    result = response.get("alibaba_item_search_shop_response", {})
    data = result.get("result", {})

    # 提取分页信息
    pagination = {
        "total_items": int(data.get("total_results", 0)),
        "total_pages": (int(data.get("total_results", 0)) + int(data.get("page_size", 40)) - 1) // int(data.get("page_size", 40)),
        "current_page": int(data.get("page", 1)),
        "page_size": int(data.get("page_size", 40))
    }

    # 提取店铺信息
    shop_info = {
        "shop_id": data.get("shop_id"),
        "shop_name": data.get("shop_name"),
        "shop_type": data.get("shop_type"),
        "main_category": data.get("main_category"),
        "credit_level": data.get("credit_level")
    }

    # 提取并格式化商品列表
    products = []
    for item in data.get("items", {}).get("item", []):
        product = {
            "product_id": item.get("product_id"),
            "title": item.get("title"),
            "image_url": item.get("image_url"),
            "detail_url": item.get("detail_url"),
            "price": {
                "min_price": float(item.get("min_price", 0)),
                "max_price": float(item.get("max_price", 0)),
                "unit": item.get("unit", "")
            },
            "trade_info": {
                "sales_count": int(item.get("sales_count", 0)),
                "trade_count": int(item.get("trade_count", 0)),
                "comment_count": int(item.get("comment_count", 0))
            },
            "stock": int(item.get("stock", 0)),
            "category": item.get("category"),
            "tags": item.get("tags", "").split(","),
            "location": item.get("location")
        }
        products.append(product)

    return {
        "pagination": pagination,
        "shop_info": shop_info,
        "products": products
    }

def get_all_shop_items(self, shop_id: str, max_pages: int = 10) -> List[Dict]:
    """
    获取店铺所有商品(分页获取)
    :param shop_id: 店铺ID
    :param max_pages: 最大页数限制,防止请求过多
    :return: 所有商品列表
    """
    all_products = []
    page = 1

    while True:
        logging.info(f"获取店铺 {shop_id} 第 {page} 页商品")
        result = self.get_shop_items(shop_id, page=page, page_size=100)

        if not result or not result["products"]:
            break

        all_products.extend(result["products"])

        # 检查是否已达最后一页或最大页数限制
        if page >= result["pagination"]["total_pages"] or page >= max_pages:
            break

        page += 1
        # 添加延迟,避免触发频率限制
        time.sleep(1)

    return all_products

示例调用
if name == "main":

# 替换为实际的appkey和appsecret(从1688开放平台获取)
APPKEY = "your_appkey"
APPSECRET = "your_appsecret"
# 替换为目标店铺ID
SHOP_ID = "12345678"

# 初始化API客户端
api = AlibabaItemSearchShopAPI(APPKEY, APPSECRET)

# 方式1:获取指定页的商品
# shop_items = api.get_shop_items(SHOP_ID, page=1, page_size=20, sort="price_asc")

# 方式2:获取店铺所有商品(分页获取)
shop_items = api.get_all_shop_items(SHOP_ID, max_pages=5)

if shop_items:
    # 如果是完整响应,处理方式略有不同
    if isinstance(shop_items, dict) and "products" in shop_items:
        print(f"店铺 {shop_items['shop_info']['shop_name']} 共有 {shop_items['pagination']['total_items']} 件商品")
        products = shop_items["products"]
    else:
        print(f"成功获取店铺 {SHOP_ID} 的 {len(shop_items)} 件商品")
        products = shop_items

    # 打印前5件商品信息
    print("\n前5件商品信息:")
    for i, product in enumerate(products[:5], 1):
        print(f"{i}. {product['title']}")
        print(f"   价格:{product['price']['min_price']}-{product['price']['max_price']}{product['price']['unit']}")
        print(f"   销量:{product['trade_info']['sales_count']} 件")
        print(f"   库存:{product['stock']}")
        print(f"   链接:{product['detail_url']}")
        print("-" * 80)

三、接口调用注意事项

  1. 调用限制与规范
    QPS 限制:默认 QPS 限制为 10,超过会返回 429 错误
    数据缓存:相同店铺的商品信息建议设置缓存,避免频繁调用
    分页处理:单页最大只能获取 100 条数据,大量商品需要分页获取
    合规使用:获取的商品数据不得用于不正当竞争或商业侵权行为
  2. 常见错误及解决方案
    错误码 说明 解决方案
    10001 签名错误 检查签名生成逻辑,确保参数排序和加密正确
    20001 店铺 ID 不存在 确认 shop_id 是否正确有效
    403 没有权限访问 检查应用是否已申请相关接口权限
    429 调用频率超限 降低调用频率,实现请求限流
    500 服务器内部错误 稍后重试,或联系 1688 开放平台技术支持
  3. 数据解析要点
    价格信息可能返回区间值(min_price 和 max_price),对应不同规格
    销量数据为 30 天内累计销量,部分店铺可能不公开
    商品详情 URL 需要拼接域名才能直接访问
    库存数据可能不是实时数据,存在一定延迟
    四、应用场景与扩展建议
    典型应用场景
    店铺商品采集与分析系统
    竞品价格监控工具
    供应链管理系统
    电商数据分析平台
    扩展建议
    实现数据持久化存储,支持历史数据分析
    添加商品价格变化趋势追踪功能
    结合商品详情接口,获取更全面的商品信息
    开发可视化报表,展示店铺商品结构和销售情况
    实现异常监控,如商品价格异常波动提醒
    通过合理使用 item_search_shop 接口,开发者可以高效获取 1688 店铺的商品数据,为电商运营和数据分析提供有力支持。使用时需遵守 1688 开放平台的相关规定,确保数据使用的合法性和合规性。
相关文章
|
13天前
|
JSON 算法 API
深度分析小红书城API接口,用Python脚本实现
小红书作为以UGC内容为核心的生活方式平台,其非官方API主要通过移动端抓包解析获得,涵盖内容推荐、搜索、笔记详情、用户信息和互动操作等功能。本文分析了其接口体系、认证机制及请求规范,并提供基于Python的调用框架,涉及签名生成、登录态管理与数据解析。需注意非官方接口存在稳定性与合规风险,使用时应遵守平台协议及法律法规。
|
18天前
|
XML 安全 测试技术
【干货满满】分享什么是API接口测试
API接口测试是验证应用程序编程接口功能、性能、安全性及兼容性的关键环节,通过模拟请求并验证响应结果,确保接口能正确处理各种输入和场景。测试内容涵盖功能验证、性能评估、安全防护、兼容性验证及系统可靠性。相比UI测试,API测试无需界面依赖,支持数据驱动与自动化,适用于持续集成流程。常见接口类型包括RESTful、SOAP和GraphQL API,广泛应用于电商、金融及社交平台,保障系统间数据交互的安全与高效。
|
22天前
|
JSON 缓存 API
深度分析淘宝API接口,用Python脚本实现
本内容深入解析淘宝开放平台 API 的接口设计与 Python 实现,涵盖接口体系、认证机制、签名规则及限流策略,并提供完整的 Python 调用框架,适用于电商系统对接与自动化运营。
|
28天前
|
域名解析 JSON API
【干货满满】如何处理requests库调用API接口时的异常情况
在调用 API 时,网络波动、服务器错误、参数异常等情况难以避免。本文提供一套系统化的异常处理方案,涵盖 requests 库常见异常类型、处理策略、实战代码与最佳实践,通过分类处理、重试机制与兜底策略,提升接口调用的稳定性与可靠性。
|
29天前
|
API 开发工具 开发者
【干货满满】电商平台API接口用python调用脚本
这是一个支持淘宝、京东、拼多多、亚马逊等主流电商平台的通用 API 调用 Python 脚本框架,适配 doubao 使用。脚本封装了签名验证、请求处理、异常捕获及限流控制等核心功能,提供统一接口调用方式,便于开发者快速集成与扩展。
|
29天前
|
消息中间件 缓存 安全
电商API数据接口深度分析
电商 API 是连接平台、商家与用户的核心枢纽,其设计直接影响数据流通效率与系统稳定性。本文从技术架构、性能优化、安全防护、合规治理等维度深度解析,结合淘宝、京东等头部平台实践,提供高并发场景下的多级缓存、异步处理、智能限流等落地解决方案,助力企业构建高效、安全、合规的 API 体系,推动电商系统智能化演进。
|
2月前
|
数据采集 数据可视化 数据挖掘
用 Excel+Power Query 做电商数据分析:从 “每天加班整理数据” 到 “一键生成报表” 的配置教程
在电商运营中,数据是增长的关键驱动力。然而,传统的手工数据处理方式效率低下,耗费大量时间且易出错。本文介绍如何利用 Excel 中的 Power Query 工具,自动化完成电商数据的采集、清洗与分析,大幅提升数据处理效率。通过某美妆电商的实战案例,详细拆解从多平台数据整合到可视化报表生成的全流程,帮助电商从业者摆脱繁琐操作,聚焦业务增长,实现数据驱动的高效运营。
|
2月前
|
边缘计算 监控 Java
跨境电商 API 对接避坑指南:亚马逊 SP-API 超时问题的 5 种解决方案(附重试代码模板)
在对接亚马逊 SP-API 时,超时问题常导致订单延迟、库存失败,影响运营。本文总结某 3C 品牌实战经验,详解超时的 3 大根源与 5 大解决方案,涵盖动态超时、重试机制、请求拆分、并发控制与边缘加速,并附可复用 Python 代码,助你将超时率从 20% 降至 1% 以下。
|
2月前
|
人工智能 自然语言处理 算法
AI与API结合:自动解析商品描述+情感分析评论数据
AI与API深度融合正在重塑电商运营模式。通过自动解析商品描述、分析评论情感,企业可实现信息标准化、用户画像精准化及运营决策自动化。本文从技术架构、核心算法、实战案例三方面,详解AI如何驱动电商智能化升级。
|
2月前
|
人工智能 安全 API
2025电商API新特性:实时数据流、GraphQL接口与隐私合规
2025年电商API迎来技术与合规双重革新,实时数据流、GraphQL接口、隐私合规成为核心突破方向,推动全息电商、动态定价、供应链协同等场景升级,实现性能优化与用户隐私保护的协同发展。