在电商数据分析、竞品监控和供应链管理等场景中,高效获取 1688 平台的商品详情实时数据具有重要价值。本文将从技术角度解析如何通过 1688 API 获取商品详情数据,并提供实用的代码实现方案。
1688 API 简介
1688 提供了一系列 API 接口获取平台上的商品信息、订单数据等。要使用这些 API,需要先完成以下准备工作:
注册账号
获取 Api Key 和 Api Secret
完成 API 权限申请
了解 API 调用的认证方式和限流规则
核心技术要点
认证机制
1688 API 主要采用 OAuth 2.0 认证方式,调用流程如下:
通过 Api Key 和 Api Secret 获取访问令牌 (Access Token)
在 API 请求中携带访问令牌进行身份验证
商品详情 API
获取商品详情的核心 API 是alibaba.product.get,可以获取商品的基本信息、价格、库存、规格等详细数据。
高效获取策略
合理设置请求参数,只获取需要的字段
实现请求缓存机制,减少重复请求
处理 API 限流,实现请求重试机制
批量获取时使用并发请求提高效率
代码实现
下面是一个基于 Python 的 1688 商品详情 API 调用实现,包含了认证、请求、错误处理等完整功能:
import requests
import time
import hashlib
import json
from urllib.parse import urlencode
import logging
from functools import lru_cache
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
class Ali1688APIClient:
def __init__(self, app_key, app_secret, access_token=None):
self.app_key = app_key
self.app_secret = app_secret
self.access_token = access_token
self.base_url = "https://gw.open.1688.com/openapi/param2/1/com.alibaba.product/"
self.timeout = 10
self.max_retries = 3
def get_access_token(self, grant_type="client_credentials"):
"""获取访问令牌"""
url = "https://gw.open.1688.com/auth/token"
params = {
"grant_type": grant_type,
"client_id": self.app_key,
"client_secret": self.app_secret
}
try:
response = requests.get(url, params=params, timeout=self.timeout)
result = response.json()
if "access_token" in result:
self.access_token = result["access_token"]
logger.info(f"成功获取access_token,有效期: {result.get('expires_in')}秒")
return self.access_token
else:
logger.error(f"获取access_token失败: {result}")
return None
except Exception as e:
logger.error(f"获取access_token异常: {str(e)}")
return None
def _generate_signature(self, params):
"""生成签名"""
# 按参数名升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接参数
sign_str = self.app_secret
for key, value in sorted_params:
sign_str += f"{key}{value}"
sign_str += self.app_secret
# 计算MD5
return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
def _api_request(self, api_name, params, need_token=True):
"""通用API请求方法"""
# 基础参数
request_params = {
"app_key": self.app_key,
"format": "json",
"v": "1.0",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"sign_method": "md5"
}
# 添加访问令牌
if need_token and self.access_token:
request_params["access_token"] = self.access_token
# 合并业务参数
request_params.update(params)
# 生成签名
request_params["sign"] = self._generate_signature(request_params)
# 构建请求URL
url = f"{self.base_url}{api_name}"
# 发送请求(带重试机制)
for retry in range(self.max_retries):
try:
logger.info(f"调用API: {api_name}, 参数: {json.dumps(params, ensure_ascii=False)}")
response = requests.get(url, params=request_params, timeout=self.timeout)
result = response.json()
# 检查是否请求成功
if "error_response" in result:
error_code = result["error_response"].get("code")
error_msg = result["error_response"].get("msg")
logger.error(f"API调用错误 [retry={retry}]: {error_code} - {error_msg}")
# 如果是令牌过期,尝试重新获取令牌
if error_code == 100006:
logger.info("令牌已过期,尝试重新获取...")
if self.get_access_token():
continue # 重新获取令牌后重试
# 达到最大重试次数
if retry == self.max_retries - 1:
return {"success": False, "error": f"{error_code} - {error_msg}"}
else:
return {"success": True, "data": result}
except Exception as e:
logger.error(f"API请求异常 [retry={retry}]: {str(e)}")
if retry == self.max_retries - 1:
return {"success": False, "error": str(e)}
# 重试前等待一段时间
time.sleep(1 * (retry + 1))
return {"success": False, "error": "达到最大重试次数"}
@lru_cache(maxsize=1000)
def get_product_detail(self, product_id, fields=None):
"""
获取商品详情
:param product_id: 商品ID
:param fields: 需要返回的字段列表,None则返回所有字段
:return: 商品详情数据
"""
if not product_id:
return {"success": False, "error": "商品ID不能为空"}
# 默认返回的字段
default_fields = "product_id,subject,price,rprice,amount,on_sale,detail_url,pic_url,sale_info"
if fields:
# 如果指定了字段,使用指定的
fields_str = ",".join(fields)
else:
fields_str = default_fields
params = {
"product_id": product_id,
"fields": fields_str
}
return self._api_request("alibaba.product.get", params)
def batch_get_product_details(self, product_ids, fields=None, max_concurrent=5):
"""
批量获取商品详情
:param product_ids: 商品ID列表
:param fields: 需要返回的字段列表
:param max_concurrent: 最大并发数
:return: 商品详情列表
"""
if not product_ids or not isinstance(product_ids, list):
return {"success": False, "error": "商品ID列表不能为空"}
results = []
# 分批处理,控制并发
for i in range(0, len(product_ids), max_concurrent):
batch = product_ids[i:i+max_concurrent]
batch_results = []
# 并发获取当前批次的商品详情
import concurrent.futures
with concurrent.futures.ThreadPoolExecutor(max_workers=max_concurrent) as executor:
# 提交所有任务
futures = {executor.submit(self.get_product_detail, pid, fields): pid for pid in batch}
# 获取结果
for future in concurrent.futures.as_completed(futures):
pid = futures[future]
try:
result = future.result()
batch_results.append({
"product_id": pid,
"result": result
})
except Exception as e:
logger.error(f"批量获取商品 {pid} 详情异常: {str(e)}")
batch_results.append({
"product_id": pid,
"result": {"success": False, "error": str(e)}
})
results.extend(batch_results)
# 每批请求后休息一下,避免触发限流
time.sleep(1)
return {"success": True, "data": results}
# 使用示例
if __name__ == "__main__":
# 替换为你的App Key和App Secret
APP_KEY = "your_app_key"
APP_SECRET = "your_app_secret"
# 初始化客户端
client = Ali1688APIClient(APP_KEY, APP_SECRET)
# 获取访问令牌
if not client.get_access_token():
print("无法获取访问令牌,程序退出")
exit(1)
# 单个商品详情获取
product_id = "610784549587" # 示例商品ID
print(f"获取商品 {product_id} 详情...")
result = client.get_product_detail(product_id)
if result["success"]:
print(json.dumps(result["data"], ensure_ascii=False, indent=2))
else:
print(f"获取失败: {result['error']}")
# 批量获取商品详情
product_ids = ["610784549587", "626644646828", "625847634767"] # 示例商品ID列表
print(f"\n批量获取商品 {product_ids} 详情...")
batch_result = client.batch_get_product_details(product_ids)
if batch_result["success"]:
for item in batch_result["data"]:
print(f"\n商品 {item['product_id']} 详情:")
if item["result"]["success"]:
print(json.dumps(item["result"]["data"], ensure_ascii=False, indent=2))
else:
print(f"获取失败: {item['result']['error']}")
else:
print(f"批量获取失败: {batch_result['error']}")代码解析
上述代码实现了一个完整的 1688 API 客户端,主要包含以下功能:
认证处理:实现了获取和刷新 Access Token 的功能
签名生成:按照 1688 API 要求生成请求签名
错误处理:包含重试机制和令牌过期自动刷新
缓存机制:使用 LRU 缓存减少重复请求
批量获取:支持并发批量获取商品详情,提高效率
核心方法说明:
get_access_token():获取访问令牌,用于 API 认证get_product_detail():获取单个商品的详情数据batch_get_product_details():批量获取多个商品的详情数据
优化建议
缓存策略:可以将获取到的商品数据存储到 Redis 等缓存中,设置合理的过期时间
分布式部署:高并发场景下,可以采用分布式部署,分散 API 请求压力
监控告警:实现 API 调用监控,当错误率或响应时间超过阈值时触发告警
请求频率控制:根据 API 限流规则,动态调整请求频率
注意事项
遵守平台的使用规范和数据使用协议
合理控制 API 调用频率,避免触发限流机制
敏感数据需要加密存储,防止信息泄露
定期检查 API 版本更新,及时适配接口变化
通过上述技术方案,可以高效、稳定地获取 1688 平台的商品详情实时数据,为电商数据分析和业务决策提供有力支持。在实际应用中,还需要根据具体业务场景进行适当调整和优化。