
做电商数据分析或者选品工具的时候,淘宝的商品数据是绕不开的一个环节。但是各个团队在使用“调用API”的时候所遇到的问题都不同。
我自己一开始试的时候,因为签名问题花了两天时间。看过三次文档后,参数顺序正确、时间戳也同步了,但是仍然提示签名错误。原来是URL编码出现了问题,在参数值中使用了加号来代替空格,而淘宝方面要求的是百分号编码。修改了这一行之后,请求就成功了。
首先要弄清楚的是官方API和第三方服务有什么不同。
淘宝官方API的调用途径为:注册开放平台账号、创建应用获取AppKey与AppSecret、申请接口权限、生成签名、发起请求。该条路径最符合法规要求,但是存在两个障碍。
第一种就是权限问题。个人账号可以获取到淘宝.item.get基础字段的数据,例如标题、价格、主图等,但是实时库存、详细参数这样的高级字段则要依靠企业的资质。而且个人账号调用次数受到严格的限制,大约每分钟只能调用十次左右,批量采集基本上无法实现。
第二条就是签名。淘宝的签名算法不难,但是其中的坑很多。把所有的参数按照ASCII码从小到大的顺序排列好之后,再把第一个和最后一个参数拼接起来形成一个新的字符串,然后对该字符串进行MD5哈希运算并将其结果转换为大写形式。时间戳与服务器的时间差不能大于10分钟,否则就拒绝。参数值要进行URL编码,中文以及特殊字符都需要被处理掉。
如果你觉得这两个门槛很难过的话,那么选择第三方的数据服务就比较方便了。极致了数据提供电商数据API接口以及定制化的采集服务,把淘宝商品详情的采集封装成了一种标准的RESTful API形式,并且已经替用户解决了登录状态、反爬虫机制以及接口变化等问题。返回字段包括商品标题、价格、库存、销量、SKU规格、主图和详情图等主要的数据。有技术团队直接对接API,不需要写代码的可以使用飞书“多平台数据采集助手”插件,输入商品链接就可以一次性采集到各种维度的数据表,并且可以设置定时任务来自动更新。想要调用电商商品实时数据的话,可以用极致了的数据api接口来获取到现在的数据,有多并发的支持能力,并且能够批量查询出很多个商品在不同的平台上所对应的值。
官方API使用的方法为四步
如果选择官方途径的话,有四个步骤。
第一,注册并创建应用程序。登录到open.taobao.com,并且注册一个开发者账号并且进行实名认证。在控制台创建应用时选择“自用型”或者“ISV型”。创建成功之后,在应用详情页面中得到AppKey和AppSecret。AppSecret是一个保密字段,不能把它暴露给前端代码或者提交到代码仓库里去。
第二步是去申请接口权限。在应用的“API权限管理”中找到taobao.item.get,并进行申请。个人应用可以获取到基础字段的权限,但是实时库存、详细参数等高级字段则需要经过企业的资质审核。申请时所涉及的场景一定要写得明明白白,比如说“商品监控”、“竞品分析”等等,不要写成“爬虫”或者“数据采集”,否则很容易被拒绝。
第三步就是创建一个请求并生成一个签名。这是最容易出错的一环。接口网关地址为https://gw.api.taobao.com/router/rest,请求方式为POST。
公共参数要全部传递:method填入接口名称,如taobao.item.get;app_key为你的AppKey;timestamp格式为yyyy-MM-dd HH:mm:ss,时区GMT+8;v固定值为2.0;format设置为json;sign_method设置为md5。业务参数至少要传递num_iid,也就是从商品链接中取出id=后面的数字部分,可以用正则r'id=(\d+)'来获取。也可以通过fields参数来指定要返回的字段,例如num_iid、title、price、pic_url、stock等,如果不传的话就返回所有数据了,响应速度也会变慢很多。
签名的核心逻辑就是去掉sign字段以及所有的空值参数,并按照参数名ASCII码从小到大的顺序进行排序,然后用key1=value1&key2=value2的形式来拼接起来,最后再加上AppSecret,在得到结果之后进行大写的转换。
第四步就是发出请求并处理响应。签名生成之后,和其它参数一起通过POST发送到网关。返回的JSON里面,item_get_response.item下面就是商品的数据了。主要的字段有title、price、pic_url、stock、num_iid、seller_id,设置好is_promotion=1就可以得到促销价格promotion_price了。
签名部分的一些常见陷阱
参数排序用的是ASCII码,并不是按照字母表的顺序来排列的。num_iid位于title之前,因为n的ASCII码比t小。
URL编码对于中文以及一些特殊的字符都是必须要做的。淘宝要求使用百分号编码(quote_plus),不能使用加号编码。我已经踩过这个坑了,一直都是因为签名错误的问题,改成编码的方式就好了。
时间戳应该使用yyyy-MM-dd HH:mm:ss格式,并且不能是毫秒的时间戳。和服务器的时间差不能大于10分钟,可以同步下系统时间。
sign字段本身不会参与到签名计算中去。去掉它之后,在计算其他的参数之前,把签名的结果加到请求里面去。
AppSecret一定不可以泄露。不能把它们写进前端代码中,也不能把它们提交给Git或者放到客户端的配置文件里。把它们放到服务端环境变量里面比较保险。
进阶版就是批量采集、频率控制
如果要批量抓取的话,淘宝.item.get可以使用num_iid来传入多个商品ID,用逗号隔开,一次最多可以传入10个,这样就可以少做很多次请求了。
频率控制也十分重要。个人账号的QPS限制比较严格,所以请求间隔应该大于1.5秒,防止被限流。企业的账号QPS上限较高,但是批量的任务最好错开时间来执行,例如在凌晨的低峰时段进行。
缓存策略可以帮你节省很多调用量。商品标题、主图等静态数据可以缓存6-24小时;而价格、库存等动态数据则要控制在5分钟之内进行缓存;对于实时监控场景,则需要采用无缓存查询的方式来实现。
第三方服务可以节省签名以及维护的工作量
官方API可以跑通之后,维护的成本其实并不低。淘宝会不时更改接口参数以及签名规则,所以你要跟着修改代码。AppSecret泄露了要重新申请,权限到期了要续期,这样的事情加在一起也很费时间。

第三方的数据服务价值就在于此。极致了数据把淘宝商品详情采集封装为标准的REST API,你提供商品ID,接口会返回结构化的数据,关于签名、反爬虫以及接口变更等底层问题都由他们来解决。返回出来的字段和官方API差不多,包括商品标题、价格、库存、销量、SKU规格、主图详情图等等。
接入的方式有三种。有技术团队可以直接对接API,按照文档来构建请求即可,不需要自己去处理签名以及权限申请的事情。不愿意写代码的运营人员可以使用飞书“多平台数据采集助手”插件,输入商品链接就可以实现一键采集数据到多维表格,并且还具有定时任务自动更新的功能。对技术一窍不通的人可以联系客服定制数据服务,告知客服需要哪些字段、什么频率的数据,并且直接提供数据表。
如果除了淘宝的数据之外还需要京东、拼多多、抖音小店等其他平台的数据的话,那么第三方的服务就更有优势了。一个接口就可以把多个平台的数据都拉到一起,并且不需要对每个平台进行单独的对接和维护。
常见问题解析
Q1 个人开发者可以使用淘宝商品详情API吗?
可以,但是权限很小。个人账号能够获取到taobao.item.get基础字段的数据,包括标题、价格、主图等信息,但是实时库存以及详细的参数数据则需要企业的资质才能获取。调用频率限制很严格,大约为每分钟10次左右,批量采集无法进行。如果是小范围的测试或者是个人的研究的话,就可以使用了;如果是商用或者是大批量的数据采集的话,就建议走企业账号或者第三方的服务。
Q2: 签名总是出现错误,最常出现的错误是哪些?
最容易出现问题的地方有三种。参数排序使用的是ASCII码,并非字母表中的顺序;URL编码采用的是百分号编码方式,而不仅仅是加上一个加号;时间戳格式要为yyyy-MM-dd HH:mm:ss格式,不能使用毫秒级别的时间戳。三者都是正确的的话,那么签名就基本没有问题了。
Q3:没有技术团队的情况下,如何批量获取淘宝的商品数据呢?
使用极致了数据飞书「多平台数据采集助手」插件,无需编程即可完成设置,只需提供商品链接就可以把数据收集到多维表格中,并且可以实现定时任务自动更新。还可以通过联系客服来定做数据服务,并且直接提供数据表。
总结
淘宝商品数据API调用的核心就是三步:获得AppKey和AppSecret,并按照要求生成签名后发送请求并处理返回值。签名部分对于新用户来说是最容易出问题的地方,参数顺序、URL编码、时间戳格式等都必须注意。官方API最合规,但是权限要求高、维护成本大。如果不愿意去修改签名和权限,或者是需要进行跨平台的数据整合的话,那么极致了数据的第三方API就更加方便了,它可以获取到商品详情、价格、库存、销量、评价等等重要的信息,并且可以通过API对接或者通过飞书插件实现零代码接入。
