Python采集电商商品详情数据接口指南
下面我将介绍如何使用Python采集电商平台的商品详情数据,包括常见的API接口类型、请求方法、数据处理以及反爬策略。
一、常见电商平台API接口类型
1. 官方开放API
-
特点:需要申请API key,有调用频率限制
-
示例:
- 淘宝开放平台API
- 京东开放平台API
- 亚马逊Product Advertising API
2. 网页端接口(Web API)
-
特点:通过分析网页请求找到的数据接口
-
常见形式:
- JSON/JSONP接口
- GraphQL接口
- RESTful API
3. 移动端API
-
特点:通常比网页端接口更简洁
-
获取方法:
- 使用抓包工具(Fiddler/Charles)分析手机App请求
- 模拟App的请求头(User-Agent, Token等)
二、完整采集示例代码
示例1:模拟请求电商平台商品详情API
python
import requests
import json
from typing import Dict, Optional
def get_product_details(api_url: str, params: Dict, headers: Dict) -> Optional[Dict]:
"""
获取电商商品详情
参数:
api_url: API接口地址
params: 请求参数
headers: 请求头信息
返回:
商品详情字典或None(请求失败时)
"""
try:
# 设置超时时间,避免长时间等待
response = requests.get(
api_url,
params=params,
headers=headers,
timeout=(5, 10) # 连接超时5秒,读取超时10秒
)
# 检查响应状态码
response.raise_for_status()
# 尝试解析JSON数据
data = response.json()
# 检查业务逻辑是否成功(根据实际API返回结构调整)
if data.get('code') == 200 or 'data' in data:
return data.get('data') or data
else:
print(f"API返回错误: {data.get('message', '未知错误')}")
return None
except requests.exceptions.RequestException as e:
print(f"请求失败: {str(e)}")
return None
except json.JSONDecodeError:
print("响应内容不是有效的JSON格式")
return None
# 示例使用 - 淘宝/天猫商品详情API(模拟)
if __name__ == "__main__":
# 实际使用时需要替换为真实的API端点和参数
api_url = "https://acs.m.taobao.com/h5/mtop.taobao.detail.getdetail/6.0"
# 请求参数 - 通常需要分析网页或App获取
params = {
"itemNumId": "123456789", # 商品ID
"detailParams": "{"itemId":"123456789"}",
# 其他必要参数...
}
# 请求头 - 模拟手机App请求
headers = {
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15",
"Referer": "https://item.taobao.com",
"Accept": "application/json",
# 可能需要添加认证token等
}
product_data = get_product_details(api_url, params, headers)
if product_data:
# 保存到文件
with open("product_detail.json", "w", encoding="utf-8") as f:
json.dump(product_data, f, ensure_ascii=False, indent=2)
print("商品详情采集成功!")
else:
print("商品详情采集失败")
示例2:处理分页和批量采集
python
import time
import random
def batch_fetch_products(product_ids: List[str], api_url: str, headers: Dict) -> List[Dict]:
"""
批量采集多个商品详情
参数:
product_ids: 商品ID列表
api_url: API接口地址
headers: 请求头信息
返回:
采集成功的商品详情列表
"""
all_products = []
for product_id in product_ids:
params = {
"itemNumId": product_id,
# 其他参数...
}
print(f"正在采集商品ID: {product_id}")
product_data = get_product_details(api_url, params, headers)
if product_data:
all_products.append(product_data)
# 随机延迟,避免请求过于频繁
time.sleep(random.uniform(0.5, 1.5))
return all_products
三、典型商品详情JSON数据结构
json
{
"success": true,
"code": 200,
"message": "请求成功",
"data": {
"product_id": "123456789",
"title": "商品标题名称",
"category": {
"id": "50012345",
"name": "手机"
},
"price_info": {
"original_price": 5999.00,
"current_price": 4999.00,
"discount": "8.3折",
"promotions": [
{
"type": "满减",
"description": "满5000减500"
}
]
},
"stock": {
"total": 1000,
"available": 892,
"status": "有货"
},
"specs": [
{
"name": "颜色",
"values": ["黑色", "白色", "蓝色"]
},
{
"name": "存储",
"values": ["128G", "256G", "512G"]
}
],
"images": [
"https://img.example.com/product/1/1.jpg",
"https://img.example.com/product/1/2.jpg"
],
"description": "商品详细描述HTML或文本内容...",
"shop_info": {
"shop_id": "10001",
"name": "官方旗舰店",
"score": 4.8,
"is_official": true
},
"service": {
"warranty": "1年质保",
"return_policy": "7天无理由退货",
"delivery": "包邮"
},
"sales": {
"monthly_sales": 15623,
"total_sales": 125632,
"comment_count": 2563
}
}
}
五、常见电商平台API特点
淘宝/天猫
- 使用MTOP (Mobile Taobao Open Platform)接口
- 需要分析手机App请求获取API
- 参数通常包含
api
,v
,data
等字段 - 可能需要计算
token
和sign
京东
- 有开放的商品搜索API
- 移动端API通常以
https://api.m.jd.com/client.action
开头 - 需要
functionId
等参数标识接口功能
亚马逊
- Product Advertising API需要申请
- 使用
ItemLookup
等操作查询商品 - 需要AWS访问密钥