速卖通API 接入指南:商品详情页实时数据采集开发教程

在跨境电商数据分析领域,速卖通 (Aliexpress) 作为全球知名的 B2C 平台,其商品数据的实时采集对商家决策、市场调研具有重要价值。本文将详细介绍如何通过速卖通API 实现商品详情页数据的实时采集,附带完整开发流程与代码示例。

1. 速卖通平台概述

速卖通平台提供了一套 RESTful API 接口,用于获取商品、订单、用户等核心数据。通过 OAuth2.0 认证机制,开发者可以安全地访问授权范围内的数据资源。

API 接入流程概览

  1. 注册账号并创建应用
  2. 获取 ApIKey 和 ApISecret
  3. 完成授权流程
  4. 调用具体 API 接口获取数据
  5. 处理返回的 JSON/XML 数据
2. 开发环境准备

必备工具与环境

  • Python 3.7+ 环境
  • HTTP 请求库:requests
  • JSON 解析库:json
  • 时间处理库:datetime

安装依赖

pip install requests python-dotenv

 

3. 应用注册与认证
3.1 注册账号
  1. 访问
  2. 使用账号登录
  3. 提交认证申请(需提供企业资质或个人身份证明)
3.2 创建应用并获取凭证
  • 登录控制台,创建新应用
  • 获取AppKeyAppSecret(需妥善保管)
  • 配置应用权限范围(如itemorder等)
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:商品 ID
    • fields:需要返回的字段列表
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. 最佳实践建议
  1. 数据缓存策略

    • 对高频访问的商品数据设置本地缓存
    • 使用 LRU 缓存或 Redis 等分布式缓存系统
  2. 定时任务优化

    • 使用 Celery 或 APScheduler 实现定时数据采集
    • 合理安排采集时间,避开流量高峰
  3. 数据清洗与标准化

    • 统一价格单位和货币类型
    • 处理特殊字符和 HTML 标签
    • 规范分类和属性名称
  4. 监控与告警

    • 监控 API 调用成功率和响应时间
    • 设置异常告警机制(邮件、短信、钉钉)
8. 常见问题解答

Q1:如何处理 API 返回的错误码?
A:根据错误码进行分类处理,如isp.frequency-limit表示触发限流,需等待后重试;invalid-token表示令牌失效,需重新获取。

Q2:API 调用频率限制是多少?
A:不同 API 的限流策略不同,一般为 5-10 次 / 秒。建议在代码中实现请求队列和间隔控制。

Q3:如何获取大量商品数据?
A:使用分页和批量请求,合理控制请求频率,避免触发限流。考虑使用异步请求提高效率。

总结

通过速卖通API,开发者可以高效地获取商品详情页的实时数据。本文详细介绍了 API 接入流程、认证机制、签名算法以及数据采集与处理的完整实现。在实际开发中,需注意 API 限流、错误处理和数据质量等问题,结合业务需求进行优化和扩展。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值