在跨境电商数据分析领域,速卖通 (Aliexpress) 作为全球知名的 B2C 平台,其商品数据的实时采集对商家决策、市场调研具有重要价值。本文将详细介绍如何通过速卖通API 实现商品详情页数据的实时采集,附带完整开发流程与代码示例。
1. 速卖通平台概述
速卖通平台提供了一套 RESTful API 接口,用于获取商品、订单、用户等核心数据。通过 OAuth2.0 认证机制,开发者可以安全地访问授权范围内的数据资源。
API 接入流程概览:
- 注册账号并创建应用
- 获取 ApIKey 和 ApISecret
- 完成授权流程
- 调用具体 API 接口获取数据
- 处理返回的 JSON/XML 数据
2. 开发环境准备
必备工具与环境:
- Python 3.7+ 环境
- HTTP 请求库:
requests
- JSON 解析库:
json
- 时间处理库:
datetime
安装依赖:
pip install requests python-dotenv
3. 应用注册与认证
3.1 注册账号
- 访问
- 使用账号登录
- 提交认证申请(需提供企业资质或个人身份证明)
3.2 创建应用并获取凭证
- 登录控制台,创建新应用
- 获取
AppKey
和AppSecret
(需妥善保管) - 配置应用权限范围(如
item
、order
等)
3.3 OAuth2.0 授权流程
import requests
import json
import time
from dotenv import load_dotenv
import os
# 加载环境变量
load_dotenv()
# 配置信息
APP_KEY = os.getenv("APP_KEY")
APP_SECRET = os.getenv("APP_SECRET")
REDIRECT_URI = "https://your-callback-url.com"
AUTHORIZATION_CODE = "" # 授权码,需通过用户授权后获取
ACCESS_TOKEN = "" # 访问令牌
REFRESH_TOKEN = "" # 刷新令牌
# 1. 获取授权码(需用户手动授权)
def get_authorization_code():
auth_url = f"https://gw.api.alibaba.com/auth/authorize.htm?client_id={APP_KEY}&redirect_uri={REDIRECT_URI}&site=aliexpress&state=init"
print(f"请访问以下URL进行授权:\n{auth_url}")
print("授权后,浏览器会重定向到您的回调URL,URL参数中的code即为授权码")
# 2. 通过授权码获取访问令牌
def get_access_token(authorization_code):
token_url = "https://gw.api.alibaba.com/openapi/http/1/system.oauth2/getToken"
payload = {
"grant_type": "authorization_code",
"need_refresh_token": "true",
"client_id": APP_KEY,
"client_secret": APP_SECRET,
"code": authorization_code,
"redirect_uri": REDIRECT_URI
}
response = requests.post(token_url, data=payload)
if response.status_code == 200:
token_data = response.json()
print("获取访问令牌成功:")
print(f"Access Token: {token_data['access_token']}")
print(f"Refresh Token: {token_data['refresh_token']}")
print(f"过期时间: {token_data['expires_in']}秒")
return token_data
else:
print(f"获取访问令牌失败:{response.text}")
return None
# 3. 刷新访问令牌
def refresh_access_token(refresh_token):
token_url = "https://gw.api.alibaba.com/openapi/http/1/system.oauth2/getToken"
payload = {
"grant_type": "refresh_token",
"client_id": APP_KEY,
"client_secret": APP_SECRET,
"refresh_token": refresh_token
}
response = requests.post(token_url, data=payload)
if response.status_code == 200:
token_data = response.json()
print("刷新访问令牌成功")
return token_data
else:
print(f"刷新访问令牌失败:{response.text}")
return None
4. 商品详情 API 调用实现
4.1 商品详情 API 接口参数
- API 名称:aliexpress.item get
- 功能:获取单个商品的详细信息
- 请求方式:POST
- 必传参数:
product_id
:商品 IDfields
:需要返回的字段列表
4.2 签名生成算法
速卖通 API 要求对请求参数进行签名,确保请求的合法性。
import hashlib
import hmac
import urllib.parse
def generate_signature(params, app_secret):
"""生成API请求签名"""
# 1. 对参数名进行字典排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接参数名和参数值
string_to_sign = app_secret
for key, value in sorted_params:
string_to_sign += f"{key}{value}"
# 3. 使用HMAC-SHA1算法生成签名
signature = hmac.new(
app_secret.encode("utf-8"),
string_to_sign.encode("utf-8"),
hashlib.sha1
).hexdigest().upper()
return signature
4.3 商品详情数据采集实现
def get_product_detail(product_id, access_token):
"""获取商品详情数据"""
api_url = "https://gw.api.alibaba.com/openapi/param2/2/aliexpress.affiliate.productdetail.get/"
# 请求参数
params = {
"app_key": APP_KEY,
"timestamp": int(time.time() * 1000), # 毫秒级时间戳
"format": "json",
"v": "2",
"sign_method": "hmac-sha1",
"session": access_token,
"product_id": product_id,
"fields": "productId,productTitle,originalPrice, salePrice, imageUrl, categoryId, rating, orderCount, storeName"
}
# 生成签名
params["sign"] = generate_signature(params, APP_SECRET)
# 发送请求
response = requests.post(api_url + APP_KEY, data=params)
if response.status_code == 200:
result = response.json()
return result
else:
print(f"API调用失败:{response.text}")
return None
# 示例调用
if __name__ == "__main__":
# 1. 获取授权码(首次调用)
# get_authorization_code()
# 2. 使用授权码获取访问令牌
# token_data = get_access_token(AUTHORIZATION_CODE)
# ACCESS_TOKEN = token_data["access_token"]
# REFRESH_TOKEN = token_data["refresh_token"]
# 3. 刷新访问令牌(如需)
# token_data = refresh_access_token(REFRESH_TOKEN)
# ACCESS_TOKEN = token_data["access_token"]
# 4. 获取商品详情
product_id = "3256804740043007" # 示例商品ID
product_data = get_product_detail(product_id, ACCESS_TOKEN)
if product_data and "result" in product_data:
print(json.dumps(product_data["result"], indent=2, ensure_ascii=False))
else:
print("获取商品详情失败")
5. 数据解析与存储
5.1 解析商品详情数据
def parse_product_data(product_data):
"""解析商品详情数据"""
if not product_data or "result" not in product_data:
return None
item = product_data["result"]
parsed_data = {
"product_id": item.get("productId"),
"title": item.get("productTitle"),
"original_price": item.get("originalPrice"),
"sale_price": item.get("salePrice"),
"image_url": item.get("imageUrl"),
"category_id": item.get("categoryId"),
"rating": item.get("rating"),
"order_count": item.get("orderCount"),
"store_name": item.get("storeName"),
"crawl_time": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
return parsed_data
5.2 数据存储(示例:保存到 CSV)
import csv
def save_to_csv(data, filename="aliexpress_products.csv"):
"""保存数据到CSV文件"""
fieldnames = ["product_id", "title", "original_price", "sale_price",
"image_url", "category_id", "rating", "order_count",
"store_name", "crawl_time"]
file_exists = os.path.isfile(filename)
with open(filename, "a", newline="", encoding="utf-8-sig") as csvfile:
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
if not file_exists:
writer.writeheader()
writer.writerow(data)
6. 错误处理与 API 限流控制
import time
def safe_api_call(func, *args, max_retries=3, **kwargs):
"""安全调用API,处理异常和限流"""
retries = 0
while retries < max_retries:
try:
result = func(*args, **kwargs)
# 检查是否被限流
if result and "errorCode" in result:
if result["errorCode"] == "isp.frequency-limit":
print("触发API限流,等待60秒后重试...")
time.sleep(60)
retries += 1
continue
else:
print(f"API错误:{result['errorCode']} - {result['errorMessage']}")
return None
return result
except Exception as e:
print(f"请求异常:{str(e)},等待10秒后重试...")
time.sleep(10)
retries += 1
print(f"达到最大重试次数({max_retries}),请求失败")
return None
7. 最佳实践建议
-
数据缓存策略:
- 对高频访问的商品数据设置本地缓存
- 使用 LRU 缓存或 Redis 等分布式缓存系统
-
定时任务优化:
- 使用 Celery 或 APScheduler 实现定时数据采集
- 合理安排采集时间,避开流量高峰
-
数据清洗与标准化:
- 统一价格单位和货币类型
- 处理特殊字符和 HTML 标签
- 规范分类和属性名称
-
监控与告警:
- 监控 API 调用成功率和响应时间
- 设置异常告警机制(邮件、短信、钉钉)
8. 常见问题解答
Q1:如何处理 API 返回的错误码?
A:根据错误码进行分类处理,如isp.frequency-limit
表示触发限流,需等待后重试;invalid-token
表示令牌失效,需重新获取。
Q2:API 调用频率限制是多少?
A:不同 API 的限流策略不同,一般为 5-10 次 / 秒。建议在代码中实现请求队列和间隔控制。
Q3:如何获取大量商品数据?
A:使用分页和批量请求,合理控制请求频率,避免触发限流。考虑使用异步请求提高效率。
总结
通过速卖通API,开发者可以高效地获取商品详情页的实时数据。本文详细介绍了 API 接入流程、认证机制、签名算法以及数据采集与处理的完整实现。在实际开发中,需注意 API 限流、错误处理和数据质量等问题,结合业务需求进行优化和扩展。