八年电商开发血泪史:淘宝评论API的接口处理

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 本文分享了一位电商开发者八年对接淘宝评论API的实战经验,涵盖接口签名、限流控制、数据清洗、情感分析及实时监控等实用技巧,并附有完整代码示例。

在电商开发这行摸爬滚打了八年,和淘宝评论 API 打交道的过程,简直就是一部 “血泪奋斗史”。从最初对接时被各种报错折磨得夜不能寐,到现在能熟练用它搭建起各种实用功能,其中的酸甜苦辣,今天就来给大伙好好唠唠,顺便分享些超实用的代码干货!

刚入行那会,接了个给电商商家做竞品分析工具的活儿,核心就是调用淘宝评论 API 抓取竞品评论。本以为按文档流程走,申请个接口权限,写几行代码调用就行,结果现实给了我狠狠一击。

申请接口权限就不顺利,淘宝开放平台对开发者资质审核严格,我把公司营业执照、应用使用场景说明改了又改,提交后还等了整整三个工作日才通过。好不容易拿到App Key和App Secret,调用接口时又卡在签名验证上。官方文档里签名算法写得晦涩难懂,参数排序、加密方式稍有差错,就返回40001签名错误。为了搞懂这算法,我对着文档研究了两天,还在 Stack Overflow 和国内技术论坛疯狂搜索,终于写出了正确的签名生成函数:

import hashlib
import hmac
import time
import urllib.parse
def generate_sign(params, app_secret):
    sorted_params = sorted(params.items(), key=lambda x: x[0])
    sign_str = app_secret
    for k, v in sorted_params:
        sign_str += f"{k}{v}"
    sign_str += app_secret
    return hmac.new(
        app_secret.encode(), sign_str.encode(), hashlib.sha256
    ).hexdigest().upper()

解决了签名问题,满心欢喜发送请求,结果又碰上接口调用频率限制。当时为了快速采集大量数据,没控制好请求频率,短时间内发送太多请求,直接被淘宝封了 IP,还收到警告邮件。无奈之下,只能研究淘宝的限流规则,用漏桶算法写了个频率控制类:

import time
class LeakyBucket:
    def __init__(self, capacity, rate):
        self.capacity = capacity
        self.rate = rate
        self.tokens = capacity
        self.last_update = time.time()
    def consume(self, tokens=1):
        now = time.time()
        # 补充令牌
        self.tokens = min(
            self.capacity, self.tokens + (now - self.last_update) * self.rate
        )
        self.last_update = now
        if self.tokens >= tokens:
            self.tokens -= tokens
            return True
        return False
# 使用示例
bucket = LeakyBucket(capacity=100, rate=20)  # 容量100,每秒补充20个令牌
if bucket.consume():
    # 调用API
    response = requests.get(api_url)
else:
    time.sleep(0.1)  # 等待令牌补充

数据到手后,也不是一帆风顺。淘宝评论数据格式复杂,有文字评论、图片评论、评分、追评等多种类型,不同类型数据结构差异大。就拿文字评论来说,有的用户会写一大段话,标点符号、表情符号混用,要准确提取关键信息,得用自然语言处理技术。为了处理这些数据,我引入了jieba分词库和TextBlob情感分析库,写了个数据清洗和情感分析函数:

import jieba
from textblob import TextBlob
def clean_and_analyze_comment(comment):
    # 分词
    words = jieba.lcut(comment)
    # 去除停用词(可根据需求扩展停用词表)
    stopwords = {"的", "了", "是", "在"}
    clean_words = [word for word in words if word not in stopwords]
    clean_comment = " ".join(clean_words)
    # 情感分析
    blob = TextBlob(clean_comment)
    sentiment = blob.sentiment.polarity
    return sentiment, clean_comment
# 示例调用
comment = "这款手机拍照效果超棒,就是电池续航不太给力"
sentiment, clean_comment = clean_and_analyze_comment(comment)
print(f"情感倾向: {sentiment}, 清洗后评论: {clean_comment}")

有一回,客户要求实时监控自家商品评论,一有新评论就及时推送通知。这可难不倒我,通过设置合适的时间间隔,不断调用淘宝评论 API 获取最新评论。但很快又出现新问题,每次获取评论都要从第一页开始查,效率极低。后来我发现接口可以通过评论时间戳来筛选,只获取上次查询时间之后的评论,大大提高了效率:

import requests
import time
# 假设last_query_time是上次查询时间戳
def get_new_comments(last_query_time, app_key, app_secret, num_iid):
    params = {
        "method": "taobao.item.reviews.get",
        "app_key": app_key,
        "num_iid": num_iid,
        "start_date": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(last_query_time)),
        "timestamp": time.strftime("%Y-%m-%d %H:%M:%S"),
        "format": "json",
        "v": "2.0",
    }
    params["sign"] = generate_sign(params, app_secret)
    response = requests.get(
        "https://eco.taobao.com/router/rest", params=params
    )
    data = response.json()
    if data["code"] == "200":
        new_comments = data["item_reviews_get_response"]["reviews"]
        return new_comments
    else:
        print(f"错误码: {data['code']}, 消息: {data.get('msg', '未知错误')}")
        return []
# 示例调用
last_query_time = 1690000000  # 假设初始时间戳
app_key = "your_app_key"
app_secret = "your_app_secret"
num_iid = "123456789"  # 商品ID
new_comments = get_new_comments(last_query_time, app_key, app_secret, num_iid)
if new_comments:
    for comment in new_comments:
        print(f"用户: {comment['user_nick']}, 评论: {comment['rate_content']}")

还有一次,项目要做一个商品评论可视化大屏,展示不同商品好评率、差评关键词云图等信息。为了保证数据实时性和准确性,我用Flask框架搭建了一个后端服务,定时调用淘宝评论 API 更新数据,再通过Echarts在前端展示可视化图表。这过程中,数据缓存又成了难题,频繁调用 API 不仅浪费资源,还可能触发限流。于是引入Redis缓存,先从缓存里读取数据,如果缓存没有再调用 API 获取,获取后存入缓存:

import redis
from flask import Flask, jsonify
app = Flask(__name__)
redis_client = redis.Redis(host="localhost", port=6379, db=0)
@app.route("/product_comments/<num_iid>", methods=["GET"])
def get_product_comments(num_iid):
    cached_data = redis_client.get(num_iid)
    if cached_data:
        return jsonify(eval(cached_data.decode("utf-8")))
    else:
        # 调用淘宝评论API获取数据,此处省略具体调用代码
        api_data = get_comments_from_api(num_iid)
        redis_client.setex(num_iid, 3600, str(api_data))  # 缓存1小时
        return jsonify(api_data)
if __name__ == "__main__":
    app.run(debug=True)

这些年,靠着不断踩坑、填坑,在[淘宝评论 API] 开发上也算积累了些经验。

"item": [
            {
                "rate_content": "哈哈,可爱",
                "rate_date": "2025年6月26日",
                "pics": [
                    "//img.alicdn.com/imgextra/i4/4611686018427380981/O1CN01NOKUjB1soPOkMQaDN_!!4611686018427380981-0-rate.jpg"
                ],
                "display_user_nick": "j**i",
                "auction_sku": "款式描述:随机1个 不支持7天无理由退换货;大小:盲盒随机不指定,不支持无理由退货退款",
                "add_feedback": "感谢宝子的喜爱和认可哦,有任何问题随时联系我们在线客服哦~~祝您生活愉快~欧气满满~",
                "add_feedback_images": [
                    "//img.alicdn.com/imgextra/i4/4611686018427380981/O1CN01NOKUjB1soPOkMQaDN_!!4611686018427380981-0-rate.jpg"
                ],
                "create_time_interval": "6月26日",
                "read_count": "1294",
                "rate_id": "1276195213019",
                "like_count": "2",
                "user_star_pic": "https://img.alicdn.com/imgextra/i3/O1CN01PIYxrZ22FGrmiDphN_!!6000000007090-2-tps-92-45.png"
            },
            {
                "rate_content": "做工很好,开出隐藏款开心😊",
                "rate_date": "2025年6月22日",
                "pics": [
                    "//img.alicdn.com/imgextra/i2/4611686018427381501/O1CN0121UA7n1Wt3sEGcFbQ_!!4611686018427381501-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i1/4611686018427381501/O1CN01a7SQsA1Wt3sEVkuNd_!!4611686018427381501-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i3/4611686018427381501/O1CN019Teoqu1Wt3sEDJx8V_!!4611686018427381501-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i4/4611686018427381501/O1CN01P28oGn1Wt3sEVjdLg_!!4611686018427381501-0-rate.jpg"
                ],
                "display_user_nick": "z**4",
                "auction_sku": "款式描述:整盒8个 不支持7天无理由退换货;大小:盲盒随机不指定,不支持无理由退货退款",
                "add_feedback": "感谢宝子的喜爱和认可哦,有任何问题随时联系我们在线客服哦~~祝您生活愉快~欧气满满~",
                "add_feedback_images": [
                    "//img.alicdn.com/imgextra/i2/4611686018427381501/O1CN0121UA7n1Wt3sEGcFbQ_!!4611686018427381501-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i1/4611686018427381501/O1CN01a7SQsA1Wt3sEVkuNd_!!4611686018427381501-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i3/4611686018427381501/O1CN019Teoqu1Wt3sEDJx8V_!!4611686018427381501-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i4/4611686018427381501/O1CN01P28oGn1Wt3sEVjdLg_!!4611686018427381501-0-rate.jpg"
                ],
                "create_time_interval": "6月22日",
                "read_count": "2911",
                "rate_id": "1275826601291",
                "like_count": "3",
                "user_star_pic": "https://img.alicdn.com/imgextra/i4/O1CN01ZlCYMx1nbVriw6u0S_!!6000000005108-2-tps-92-45.png"
            },
            {
                "rate_content": "绝对正品,开出来了个藕丙,很满意。",
                "rate_date": "2025年6月14日",
                "pics": [
                    "//img.alicdn.com/imgextra/i4/4611686018427386657/O1CN019zbwet1sfFTQyYfpd_!!4611686018427386657-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i4/4611686018427386657/O1CN01ecQqiS1sfFTPhEzq2_!!4611686018427386657-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i4/4611686018427386657/O1CN01YYnEOs1sfFTNakzj2_!!4611686018427386657-0-rate.jpg"
                ],
                "display_user_nick": "隆**外",
                "auction_sku": "款式描述:随机1个 不支持7天无理由退换货;大小:盲盒随机不指定,不支持无理由退货退款",
                "add_feedback": "感谢宝子的喜爱和认可哦,有任何问题随时联系我们在线客服哦~~祝您生活愉快~欧气满满~",
                "add_feedback_images": [
                    "//img.alicdn.com/imgextra/i4/4611686018427386657/O1CN019zbwet1sfFTQyYfpd_!!4611686018427386657-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i4/4611686018427386657/O1CN01ecQqiS1sfFTPhEzq2_!!4611686018427386657-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i4/4611686018427386657/O1CN01YYnEOs1sfFTNakzj2_!!4611686018427386657-0-rate.jpg"
                ],
                "create_time_interval": "6月14日",
                "read_count": "5509",
                "rate_id": "1275035769683",
                "like_count": "1",
                "user_star_pic": "https://img.alicdn.com/imgextra/i4/O1CN01ZlCYMx1nbVriw6u0S_!!6000000005108-2-tps-92-45.png"
            },
            {
                "rate_content": "不错,幸好我拿的货没有瑕疵。也就乖巧饼饼手中的小哪吒衣服不够完美。小问题,捣蛋哪吒太可爱了。展示盒还没来,就先把两只摆在书桌上一起学习~ 捣蛋哪吒给的情绪价值拉满了,如果8个玩偶只能选一个,必选这个。质量都非常高,还有很多小摆件",
                "rate_date": "2025年6月17日",
                "pics": [
                    "//img.alicdn.com/imgextra/i1/4611686018427381253/O1CN01FM7HRA1uhemtrjkiC_!!4611686018427381253-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i1/4611686018427381253/O1CN016BJBTq1uhemwEWO6g_!!4611686018427381253-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i1/4611686018427381253/O1CN01U6JcJL1uhempUiovG_!!4611686018427381253-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i1/4611686018427381253/O1CN0128RMfG1uhemvWsG85_!!4611686018427381253-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i3/4611686018427381253/O1CN01AFDXLB1uhemwv6nfK_!!4611686018427381253-0-rate.jpg"
                ],
                "display_user_nick": "以**舞",
                "auction_sku": "款式描述:整盒8个 不支持7天无理由退换货;大小:盲盒随机不指定,不支持无理由退货退款",
                "add_feedback": "感谢宝子的喜爱和认可哦,有任何问题随时联系我们在线客服哦~~祝您生活愉快~欧气满满~",
                "add_feedback_images": [
                    "//img.alicdn.com/imgextra/i2/4611686018427381253/O1CN01nAET181uhenNWTCvn_!!4611686018427381253-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i2/4611686018427381253/O1CN0103a2K71uhenGlicH4_!!4611686018427381253-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i4/4611686018427381253/O1CN01butxty1uhenMgzTaI_!!4611686018427381253-0-rate.jpg",
                    "//img.alicdn.com/imgextra/i3/4611686018427381253/O1CN01ww7yRb1uhenLYkrE0_!!4611686018427381253-0-rate.jpg"
                ],
                "create_time_interval": "7月10日",
                "read_count": "10369",
                "rate_id": "1275276637438",
                "like_count": "11",
                "user_star_pic": "https://img.alicdn.com/imgextra/i1/O1CN01Bm9gkz1yASEqBM8xQ_!!6000000006538-2-tps-92-45.png",
                "video": "//cloud.video.taobao.com/play/u/null/p/1/d/hd/e/6/t/1/523461661535.mp4",
                "video_cover": "//img.alicdn.com/imgextra/i2/O1CN01wTPvpu1uhemvXVfM2_!!4611686018427381253-0-tbbala.jpg"
相关文章
|
25天前
|
JSON API 数据格式
淘宝/天猫图片搜索API接口,json返回数据。
淘宝/天猫平台虽未开放直接的图片搜索API,但可通过阿里妈妈淘宝联盟或天猫开放平台接口实现类似功能。本文提供基于淘宝联盟的图片关联商品搜索Curl示例及JSON响应说明,适用于已获权限的开发者。如需更高精度搜索,可选用阿里云视觉智能API。
|
23天前
|
JSON API 数据安全/隐私保护
深度分析淘宝卖家订单详情API接口,用json返回数据
淘宝卖家订单详情API(taobao.trade.fullinfo.get)是淘宝开放平台提供的重要接口,用于获取单个订单的完整信息,包括订单状态、买家信息、商品明细、支付与物流信息等,支撑订单管理、ERP对接及售后处理。需通过appkey、appsecret和session认证,并遵守调用频率与数据权限限制。本文详解其使用方法并附Python调用示例。
|
23天前
|
缓存 API 网络架构
淘宝item_search_similar - 搜索相似的商品API接口,用python返回数据
淘宝联盟开放平台中,可通过“物料优选接口”(taobao.tbk.dg.optimus.material)实现“搜索相似商品”功能。该接口支持根据商品 ID 获取相似推荐商品,并返回商品信息、价格、优惠等数据,适用于商品推荐、比价等场景。本文提供基于 Python 的实现示例,包含接口调用、数据解析及结果展示。使用时需配置淘宝联盟的 appkey、appsecret 和 adzone_id,并注意接口调用频率限制和使用规范。
|
28天前
|
监控 算法 API
电商API接口对接实录:淘宝优惠券接口对接处理促销监控系统
在电商开发中,淘宝详情页的“券后价计算”是极易出错的环节。本文作者结合实战经验,分享了因忽略满减券门槛、有效期、适用范围等导致的踩坑经历,并提供了完整的解决方案,包括淘宝API签名生成、券后价计算逻辑、常见坑点及优化建议,助力开发者精准实现券后价功能,避免业务损失。
|
25天前
|
JSON API 开发者
淘宝店铺的所有商品API接口,Curl返回数据
淘宝平台未开放获取全店商品的公共API,开发者可通过阿里妈妈的淘宝联盟API获取参与推广的商品。需成为联盟开发者、创建应用,并通过adzone_id关联店铺。使用taobao.tbk.shop.get和taobao.tbk.item.info.get接口,可获取商品列表及详情,但需注意签名生成、调用频率限制及合规要求。未参与推广的商品无法通过该方式获取。
|
25天前
|
API Python
Python采集淘宝店铺所有商品API接口指南
淘宝没有公开的官方API供采集店铺商品数据,但可以通过以下几种方法获取商品信息。需要注意的是,淘宝有严格的反爬机制,直接采集可能违反其服务条款。
|
25天前
|
JSON 数据挖掘 API
淘宝详情API接口与高级详情API接口用json返回数据区别
淘宝“商品详情API”与“高级商品API”主要区别在于数据深度、字段丰富度及适用场景。前者适用于轻量级导购展示,后者支持详情页展示与深度分析,需根据业务需求选择使用。
|
26天前
|
搜索推荐 数据挖掘 API
【干货满满】阿里妈妈API接口和淘宝联盟的接口有哪些区别
阿里妈妈API覆盖全链路营销,包含广告投放、数据分析及淘宝客推广,适用于品牌商家与营销工具;淘宝联盟API则专注淘宝客业务,提供商品查询、链接生成与佣金结算等功能,适合推广者使用。两者在功能、权限及应用场景上各有侧重。