1688 作为阿里巴巴旗下的批发电商平台,其开放的 API 接口为开发者提供了合规获取商品数据、商家信息的渠道。本文将从 API 接入准备、接口调用开发、数据抓取与解析等维度,完整拆解 1688 API 接口开发全流程,并结合实战代码实现商品数据抓取,同时探讨合规与反爬注意事项。
一、1688 API 开发前置准备
1.1 开发者账号创建
- 注册开发者账号:访问 1688 开放平台账号注册。
- 创建应用:获取
ApiKey和ApiSecret(核心凭证,需妥善保管)。 - 接口权限申请:根据业务需求申请对应接口权限(如商品详情查询、商品列表获取等)。
1.2 核心概念与协议
1688 API 基于 HTTP/HTTPS 协议,支持 RESTful 风格,数据格式以 JSON 为主,核心认证方式为签名认证:通过 AppKey、AppSecret、时间戳、请求参数等生成签名,确保请求合法性。
二、API 接口开发核心流程
2.1 签名生成逻辑
1688 API 请求必须携带签名(sign),生成规则如下:
- 将所有请求参数(含公共参数:app_key、timestamp、format 等)按参数名 ASCII 码升序排列;
- 将排序后的参数拼接为
key1=value1&key2=value2格式; - 在拼接字符串首尾拼接 AppSecret,得到
AppSecretkey1=value1&key2=value2AppSecret; - 对拼接后的字符串进行 MD5 加密(大写),得到签名 sign。
2.2 公共请求参数
所有 API 请求均需携带以下公共参数:
| 参数名 | 说明 | 示例 |
|---|---|---|
| app_key | 应用唯一标识 | 12345678 |
| method | 接口方法名 | alibaba.item.get |
| timestamp | 时间戳(毫秒) | 1718000000000 |
| format | 响应格式 | json |
| v | API 版本 | 2.0 |
| sign | 签名 | E89F95C6089879890987654321 |
三、实战:商品数据抓取代码实现
以下以 Python 为例,实现 1688 商品详情接口调用,抓取商品标题、价格、规格等核心数据。
3.1 环境准备
安装依赖库:
pip install requests hashlib urllib.parse
3.2 核心代码实现
import requests
import hashlib
import time
import urllib.parse
class Ali1688API:
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.base_url = "https://gw.open.1688.com/openapi/param2/1/"
def generate_sign(self, params):
"""生成签名"""
# 1. 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 2. 拼接参数字符串
sign_str = ""
for key, value in sorted_params:
if value is not None and value != "":
sign_str += f"{key}{value}"
# 3. 首尾拼接AppSecret
sign_str = self.app_secret + sign_str + self.app_secret
# 4. MD5加密并转大写
sign = hashlib.md5(sign_str.encode()).hexdigest().upper()
return sign
def get_item_detail(self, item_id):
"""
获取商品详情
:param item_id: 商品ID
:return: 商品详情字典
"""
# 1. 构造请求参数
method = "alibaba.item.get" # 商品详情接口方法名
timestamp = str(int(time.time() * 1000)) # 毫秒时间戳
params = {
"app_key": self.app_key,
"method": method,
"timestamp": timestamp,
"format": "json",
"v": "2.0",
"item_id": item_id,
"fields": "item_id,title,price,spec_info,sku_list,shop_name" # 需要返回的字段
}
# 2. 生成签名
sign = self.generate_sign(params)
params["sign"] = sign
# 3. 发送请求
try:
response = requests.get(self.base_url + method, params=params, timeout=10)
response.raise_for_status() # 抛出HTTP异常
result = response.json()
# 4. 解析响应
if result.get("error_response"):
print(f"接口调用失败:{result['error_response']['msg']}")
return None
return result["alibaba_item_get_response"]["item"]
except Exception as e:
print(f"请求异常:{str(e)}")
return None
# #################### 调用示例 ####################
if __name__ == "__main__":
# 替换为自己的AppKey和AppSecret
APP_KEY = "你的AppKey"
APP_SECRET = "你的AppSecret"
# 初始化API对象
api = Ali1688API(APP_KEY, APP_SECRET)
# 抓取指定商品ID的详情(替换为实际商品ID)
item_id = "699788888888"
item_detail = api.get_item_detail(item_id)
if item_detail:
print("商品详情:")
print(f"商品ID:{item_detail.get('item_id')}")
print(f"商品标题:{item_detail.get('title')}")
print(f"商品价格:{item_detail.get('price')}")
print(f"店铺名称:{item_detail.get('shop_name')}")
print(f"规格信息:{item_detail.get('spec_info')}")
3.3 代码说明
- 签名生成:
generate_sign方法严格遵循 1688 签名规则,确保请求通过认证; - 接口调用:
get_item_detail方法封装了商品详情接口的请求逻辑,支持指定返回字段,减少数据传输量; - 异常处理:捕获 HTTP 请求异常、接口错误响应,提高代码健壮性。
四、批量商品数据抓取方案
若需批量抓取商品数据(如店铺商品列表、类目商品),可基于上述基础框架扩展:
4.1 分页抓取商品列表
以 “阿里巴巴店铺商品列表接口” 为例,核心逻辑:
def get_shop_item_list(self, seller_nick, page_no=1, page_size=20):
"""
获取店铺商品列表
:param seller_nick: 卖家昵称
:param page_no: 页码
:param page_size: 每页条数
:return: 商品列表
"""
method = "alibaba.item.seller.list.get"
timestamp = str(int(time.time() * 1000))
params = {
"app_key": self.app_key,
"method": method,
"timestamp": timestamp,
"format": "json",
"v": "2.0",
"seller_nick": seller_nick,
"page_no": page_no,
"page_size": page_size,
"fields": "item_id,title,price"
}
sign = self.generate_sign(params)
params["sign"] = sign
try:
response = requests.get(self.base_url + method, params=params, timeout=10)
result = response.json()
if result.get("error_response"):
print(f"获取商品列表失败:{result['error_response']['msg']}")
return None
return result["alibaba_item_seller_list_get_response"]["items"]["item"]
except Exception as e:
print(f"批量抓取异常:{str(e)}")
return None
4.2 异步批量抓取优化
对于大批量数据(如上万条商品),建议使用异步请求提升效率:
import aiohttp
import asyncio
async def async_get_item_detail(self, item_id):
"""异步获取商品详情"""
# 签名生成逻辑同同步方法
timestamp = str(int(time.time() * 1000))
params = {
"app_key": self.app_key,
"method": "alibaba.item.get",
"timestamp": timestamp,
"format": "json",
"v": "2.0",
"item_id": item_id,
"fields": "item_id,title,price"
}
params["sign"] = self.generate_sign(params)
async with aiohttp.ClientSession() as session:
try:
async with session.get(self.base_url + "alibaba.item.get", params=params, timeout=10) as response:
result = await response.json()
return result["alibaba_item_get_response"]["item"]
except Exception as e:
print(f"异步请求失败:{str(e)}")
return None
# 批量异步调用
async def batch_crawl_items(self, item_ids):
tasks = [self.async_get_item_detail(item_id) for item_id in item_ids]
results = await asyncio.gather(*tasks)
return [res for res in results if res is not None]
五、合规与反爬注意事项
- 接口调用限制:1688 API 有 QPS 限制(通常单应用 10QPS),需控制请求频率,避免触发限流;
- 数据用途合规:抓取的数据仅可用于合规业务场景,不得用于倒卖、恶意竞争等违规行为;
- 避免高频请求:批量抓取时建议添加随机延迟(如 0.5-2 秒),避免被平台判定为异常请求;
- 签名安全:AppSecret 切勿硬编码在前端代码中,建议部署在服务端,通过接口转发调用;
- 备用方案:若 API 权限不足,可考虑合规的爬虫方案(需遵守 robots 协议,使用代理 IP 池、随机 UA 等),但需注意 1688 反爬机制(如验证码、Cookie 验证)。
六、总结
1688 API 接口开发的核心在于签名认证的正确实现和请求频率的合理控制。本文从前置准备、核心流程、代码实现到批量抓取优化,完整覆盖了商品数据抓取的全流程。在实际开发中,需结合业务场景选择同步 / 异步方案,同时严格遵守平台规则,确保数据抓取的合规性和稳定性。
对于复杂场景(如实时商品监控、多维度数据分析),可基于本文代码扩展数据存储(如 MySQL、MongoDB)、数据清洗、可视化等模块,形成完整的 1688 数据应用体系。