在电商数据分析、竞品监控等场景中,抓取淘宝商品数据是常见需求。淘宝开放平台(Open Platform)提供了标准化的 API 接口,通过合法途径调用可高效获取商品信息。本文将分别基于 Python、PHP、Node.js 三种语言,详解淘宝 API 商品数据抓取的开发流程,并提供完整代码示例。
一、淘宝 API 准备工作
在开发前,需完成以下准备步骤:
注册开发者账号
访问注册账号并完成实名认证,创建应用(应用类型选择 “服务型应用”)。获取 API 权限
在应用管理中,申请 “商品基础信息查询”“商品搜索” 等相关接口权限(部分接口需审核)。获取关键参数
应用创建后,获取ApiKey
和ApiSecret
(用于接口签名),并记录接口调用地址。了解接口文档
核心接口参考:- 商品详情接口:
taobao.item.get
(获取单个商品信息) - 商品搜索接口:
taobao.tbk.item.search
(搜索商品列表)
- 商品详情接口:
二、API 调用核心原理
淘宝 API 采用 RESTful 风格,调用需满足:
- 请求方式:
GET
或POST
- 参数格式:支持 JSON 或 XML(推荐 JSON)
- 签名机制:所有请求需通过签名验证,签名生成规则为:
- 按参数名 ASCII 升序排序
- 拼接为
key=value
形式并串联 - 拼接
App Secret
后进行 MD5 加密,转为大写
三、分语言实现
1. Python 实现
依赖库:requests
(用于 HTTP 请求)
import requests
import time
import hashlib
# 配置信息
APP_KEY = "你的App Key"
APP_SECRET = "你的App Secret"
API_URL = "https://eco.taobao.com/router/rest"
def get_taobao_item(item_id):
"""调用taobao.item.get接口获取商品详情"""
# 1. 构造基础参数
params = {
"method": "taobao.item.get",
"app_key": APP_KEY,
"format": "json",
"v": "2.0",
"timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
"fields": "num_iid,title,price,pic_url,detail_url", # 需要返回的字段
"num_iid": item_id # 商品ID
}
# 2. 生成签名
# 按参数名ASCII升序排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接为key=value形式
sign_str = APP_SECRET
for k, v in sorted_params:
sign_str += f"{k}{v}"
sign_str += APP_SECRET
# MD5加密并转为大写
sign = hashlib.md5(sign_str.encode()).hexdigest().upper()
params["sign"] = sign
# 3. 发送请求
response = requests.get(API_URL, params=params)
result = response.json()
# 4. 解析结果
if "error_response" in result:
print(f"错误:{result['error_response']['msg']}")
return None
return result["item_get_response"]["item"]
# 示例:获取商品ID为123456的详情
if __name__ == "__main__":
item = get_taobao_item("123456")
if item:
print(f"商品ID:{item['num_iid']}")
print(f"商品名称:{item['title']}")
print(f"商品价格:{item['price']}元")
print(f"商品图片:{item['pic_url']}")
print(f"商品链接:{item['detail_url']}")
2. PHP 实现
依赖:PHP cURL 扩展(用于 HTTP 请求)
<?php
// 配置信息
$appKey = "你的App Key";
$appSecret = "你的App Secret";
$apiUrl = "https://eco.taobao.com/router/rest";
/**
* 调用taobao.item.get接口获取商品详情
* @param string $itemId 商品ID
* @return array|false 商品信息或false
*/
function getTaobaoItem($itemId) {
global $appKey, $appSecret, $apiUrl;
// 1. 构造基础参数
$params = [
"method" => "taobao.item.get",
"app_key" => $appKey,
"format" => "json",
"v" => "2.0",
"timestamp" => date("Y-m-d H:i:s"),
"fields" => "num_iid,title,price,pic_url,detail_url",
"num_iid" => $itemId
];
// 2. 生成签名
ksort($params); // 按参数名ASCII升序排序
$signStr = $appSecret;
foreach ($params as $k => $v) {
$signStr .= $k . $v;
}
$signStr .= $appSecret;
$sign = strtoupper(md5($signStr));
$params["sign"] = $sign;
// 3. 发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $apiUrl . "?" . http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// 4. 解析结果
$result = json_decode($response, true);
if (isset($result["error_response"])) {
echo "错误:" . $result["error_response"]["msg"];
return false;
}
return $result["item_get_response"]["item"];
}
// 示例:获取商品ID为123456的详情
$item = getTaobaoItem("123456");
if ($item) {
echo "商品ID:" . $item["num_iid"] . "\n";
echo "商品名称:" . $item["title"] . "\n";
echo "商品价格:" . $item["price"] . "元\n";
echo "商品图片:" . $item["pic_url"] . "\n";
echo "商品链接:" . $item["detail_url"] . "\n";
}
?>
3. Node.js 实现
依赖库:axios
(用于 HTTP 请求),需先安装:npm install axios
const axios = require('axios');
const crypto = require('crypto');
// 配置信息
const APP_KEY = "你的App Key";
const APP_SECRET = "你的App Secret";
const API_URL = "https://eco.taobao.com/router/rest";
/**
* 调用taobao.item.get接口获取商品详情
* @param {string} itemId 商品ID
* @returns {Promise<Object|null>} 商品信息
*/
async function getTaobaoItem(itemId) {
try {
// 1. 构造基础参数
const params = {
method: "taobao.item.get",
app_key: APP_KEY,
format: "json",
v: "2.0",
timestamp: new Date().toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
hour12: false
}).replace(/\//g, '-'), // 格式化时间为YYYY-MM-DD HH:MM:SS
fields: "num_iid,title,price,pic_url,detail_url",
num_iid: itemId
};
// 2. 生成签名
const sortedKeys = Object.keys(params).sort();
let signStr = APP_SECRET;
sortedKeys.forEach(key => {
signStr += key + params[key];
});
signStr += APP_SECRET;
const sign = crypto.createHash('md5').update(signStr).digest('hex').toUpperCase();
params.sign = sign;
// 3. 发送请求
const response = await axios.get(API_URL, { params });
const result = response.data;
// 4. 解析结果
if (result.error_response) {
console.error(`错误:${result.error_response.msg}`);
return null;
}
return result.item_get_response.item;
} catch (error) {
console.error("请求失败:", error.message);
return null;
}
}
// 示例:获取商品ID为123456的详情
(async () => {
const item = await getTaobaoItem("123456");
if (item) {
console.log(`商品ID:${item.num_iid}`);
console.log(`商品名称:${item.title}`);
console.log(`商品价格:${item.price}元`);
console.log(`商品图片:${item.pic_url}`);
console.log(`商品链接:${item.detail_url}`);
}
})();
四、注意事项
- API 权限与配额:淘宝 API 对不同接口有调用次数限制,需在开放平台查看配额,避免超限。
- 签名正确性:签名生成是核心步骤,需严格按照 “参数排序 + 拼接 + MD5 加密” 流程实现,否则会返回 “签名错误”。
- 数据合规性:抓取的数据不得用于非法用途或侵犯用户隐私。
- 错误处理:代码中需处理网络异常、接口限流、权限不足等错误,确保程序稳定性。
- 字段选择:
fields
参数可指定返回字段,减少数据传输量,具体支持的字段参考官方接口文档。
五、扩展方向
- 批量抓取:通过循环调用接口实现多商品数据获取(注意控制频率,避免触发反爬)。
- 数据存储:将抓取的商品数据存入 MySQL、MongoDB 等数据库,方便后续分析。
- 可视化展示:使用 ECharts、Matplotlib 等工具对商品价格、销量等数据进行可视化分析。
通过本文的教程,你可以快速实现基于三种主流语言的淘宝 API 商品数据抓取功能,为电商数据分析、应用开发等场景提供数据支持。