
天貓商品數據爬取方案:官方API與非官方接口實戰
要開發1688商品詳情API接口,你需要遵循以下步驟:
準備工作
pip install requests python-dotenv
基本API實現
import requests
import hashlib
import time
import urllib.parse
from dotenv import load_dotenv
import os
# 加載環境變量
load_dotenv()
class AlibabaAPI:
def __init__(self):
self.app_key = os.getenv('1688_APP_KEY')
self.app_secret = os.getenv('1688_APP_SECRET')
self.api_gateway = 'https://gw.open.1688.com/openapi/'
def _generate_signature(self, params):
"""生成簽名"""
# 按參數名排序
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接字符串
param_str = ''
for k, v in sorted_params:
param_str += f'{k}{v}'
# 拼接app_secret
sign_str = self.app_secret + param_str + self.app_secret
# MD5加密并轉為大寫
return hashlib.md5(sign_str.encode('utf-8')).hexdigest().upper()
def get_product_detail(self, product_id):
"""獲取商品詳情"""
# API配置
api_namespace = 'param2/1/com.alibaba.trade/'
api_name = 'alibaba.trade.getBuyerOrderList'
api_version = '1'
# 公共參數
params = {
'_aop_timestamp': str(int(time.time() * 1000)),
'_aop_datePattern': 'yyyy-MM-dd HH:mm:ss',
'app_key': self.app_key,
'productId': product_id,
# 其他必要參數...
}
# 生成簽名
params['_aop_signature'] = self._generate_signature(params)
# 構建請求URL
api_url = f"{self.api_gateway}{api_namespace}{api_name}/{api_version}"
try:
response = requests.get(api_url, params=params)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"API請求失敗: {e}")
return None
# 使用示例
if __name__ == '__main__':
api = AlibabaAPI()
product_info = api.get_product_detail('商品ID')
print(product_info)
更完整的實現方案使用OAuth2.0授權
1688 API通常需要用戶授權,你需要實現OAuth流程:
def get_auth_url(self, redirect_uri, state=None):
"""獲取授權URL"""
params = {
'client_id': self.app_key,
'site': '1688',
'redirect_uri': redirect_uri,
'state': state or 'random_state'
}
return f"https://auth.1688.com/oauth/authorize?{urllib.parse.urlencode(params)}"
def get_access_token(self, code, redirect_uri):
"""使用授權碼獲取access_token"""
url = 'https://gw.open.1688.com/auth/token'
params = {
'grant_type': 'authorization_code',
'need_refresh_token': 'true',
'client_id': self.app_key,
'client_secret': self.app_secret,
'redirect_uri': redirect_uri,
'code': code
}
response = requests.post(url, data=params)
return response.json()
處理API響應
def handle_response(self, response):
"""處理API響應"""
if response.status_code != 200:
raise Exception(f"API請求失敗,狀態碼: {response.status_code}")
data = response.json()
if 'error_code' in data:
error_msg = data.get('error_message', '未知錯誤')
raise Exception(f"API返回錯誤: {error_msg}")
return data
響應示例
{
"api": "cdy.1688.detail.info",
"data": {
"attribute": {
"offerId": 663440290104,
"propUrl": "https://air.1688.com/pages/od/1688-drawer-layout/dx4c1wsd4/index.html?spm=a26g8.24198408.0.0.46af4989rkKRh9&__pageId__=1963053&wh_pid=1963053&pha_html=nativeodpop&heightRatio=0.8&bgColor=FFFFFF&bgColorStr=03000000",
"propsList": [
{
"name": "是否進口",
"show": false,
"value": "否"
},
{
"name": "品牌",
"show": false,
"value": "宇婷"
},
"name": "型號",
...
...
]
...
...
}
"left_nums": 38,
"v": "1.0"
}
最佳實踐建議
注意事項
開發完成后,你可以將此API集成到你的電商系統、價格監控工具或其他需要1688商品數據的應用中。
原文轉載自:https://mp.weixin.qq.com/s/bUvKbpEri8VrM41DWniWvQ