一、故事开场:为什么选官方 API?
很多小伙伴一提到“淘宝爬虫”就想到 Selenium + 滑块破解,其实:
- 淘宝把最完整、最准确的数据 已通过 API 打包好
- 官方接口 不封 IP、不限语言,每天 5000 次免费额度,个人学习绰绰有余
- Java 有 HttpClient + Jackson,10 行代码就能拿到 JSON
- 今天带你走“正道”,用官方接口 一次性拿到商品标题、价格、主图、SKU、销量。
二、准备工作(5 分钟)
- 注册 淘宝开放平台 → 创建应用 → 拿到 App Key & App Secret
- 在“能力市场”搜索 taobao.item.get 并申请(个人开发者一般秒过)
- 新建 Maven 项目,引入依赖:
xml
<!-- pom.xml -->
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.15.2</version>
</dependency>
</dependencies>
三、核心代码(可直接跑)
java
public class TaobaoDetailSpider {
private static final String API = "https://eco.taobao.com/router/rest";
public static void main(String[] args) throws Exception {
String appKey = "你的AppKey";
String appSecret = "你的AppSecret";
String numIid = "634049407766"; // 商品ID(手机淘宝分享→复制链接→提取)
String json = getItem(appKey, appSecret, numIid);
System.out.println("原始JSON:\n" + json);
// 解析
ObjectMapper mapper = new ObjectMapper();
JsonNode root = mapper.readTree(json);
JsonNode item = root.path("item_get_response").path("item");
System.out.println("-------------- 商品详情 --------------");
System.out.println("标题:"+item.path("title").asText());
System.out.println("价格:"+item.path("price").asText());
System.out.println("主图:"+item.path("pic_url").asText());
System.out.println("销量:"+item.path("sales").asInt());
}
/* -------------- 调用官方接口 -------------- */
private static String getItem(String appKey, String appSecret, String numIid) throws Exception {
Map<String,String> params = new HashMap<>();
params.put("method","taobao.item.get");
params.put("app_key",appKey);
params.put("v","2.0");
params.put("format","json");
params.put("sign_method","md5");
params.put("timestamp",String.valueOf(System.currentTimeMillis()/1000));
params.put("num_iid",numIid);
params.put("fields","title,price,pic_url,sales,skus");
params.put("sign",sign(params,appSecret));
String url = API + "?" + toQuery(params);
try(CloseableHttpClient client = HttpClients.createDefault()){
return EntityUtils.toString(client.execute(new HttpGet(url)).getEntity());
}
}
/* -------------- MD5 签名 -------------- */
private static String sign(Map<String,String> map,String secret){
String str = map.entrySet().stream()
.sorted(Map.Entry.comparingByKey())
.map(e->e.getKey()+e.getValue())
.collect(Collectors.joining(""));
return DigestUtils.md5Hex(secret + str + secret).toUpperCase();
}
private static String toQuery(Map<String,String> map){
return map.entrySet().stream()
.map(e->e.getKey()+"="+URLEncoder.encode(e.getValue(),StandardCharsets.UTF_8))
.collect(Collectors.joining("&"));
}
}
四、运行效果
-------------- 商品详情 --------------
标题:Sony/索尼 WH-1000XM5 高解析度真无线降噪耳机
价格:2399.00
主图:https://img.alicdn.com/imgextra/...
销量:18234
想拿 SKU 库存、优惠券、评论数?把 fields 换成 skus,coupon_info,rate_count 即可,字段名官方文档里全都有。
五、常见坑 & 小贴士
问题 | 解决方案 |
---|---|
提示“权限不足” | 后台→能力管理→勾选 taobao.item.get |
返回空值 | 检查 num_iid 是否完整(11~12位数字) |
想批量抓 | 用线程池 + 队列,官方 QPS=1,免费额度 5000/日 |
怕超量 | 升级企业账号或购买流量包,100万次≈几十元 |
六、再往前一步:把数据存起来
java
// 引入 MongoDB 驱动
MongoCollection<Document> coll = MongoClients.create().getDatabase("tb").getCollection("item");
coll.insertOne(Document.parse(item.toString()));
一条命令入库,第二天就能用 MongoDB Compass 做可视化分析。
七、总结:一句顺口溜记住API
“数据不爬,接口去拿;签名一算,JSON 到家。”