一、故事開(kāi)場(chǎng):為什么選官方 API?
很多小伙伴一提到“淘寶爬蟲(chóng)”就想到 Selenium + 滑塊破解,其實(shí):
- 淘寶把最完整、最準(zhǔn)確的數(shù)據(jù) 已通過(guò) API 打包好
- 官方接口 不封 IP、不限語(yǔ)言,每天 5000 次免費(fèi)額度,個(gè)人學(xué)習(xí)綽綽有余
- Java 有 HttpClient + Jackson,10 行代碼就能拿到 JSON
- 今天帶你走“正道”,用官方接口 一次性拿到商品標(biāo)題、價(jià)格、主圖、SKU、銷量。
二、準(zhǔn)備工作(5 分鐘)
- 注冊(cè) 淘寶開(kāi)放平臺(tái) → 創(chuàng)建應(yīng)用 → 拿到 App Key & App Secret
- 在“能力市場(chǎng)”搜索 taobao.item.get 并申請(qǐng)(個(gè)人開(kāi)發(fā)者一般秒過(guò))
- 新建 Maven 項(xiàng)目,引入依賴:
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(手機(jī)淘寶分享→復(fù)制鏈接→提?。?
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("標(biāo)題:"+item.path("title").asText());
System.out.println("價(jià)格:"+item.path("price").asText());
System.out.println("主圖:"+item.path("pic_url").asText());
System.out.println("銷量:"+item.path("sales").asInt());
}
/* -------------- 調(diào)用官方接口 -------------- */
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("&"));
}
}
四、運(yùn)行效果
-------------- 商品詳情 --------------
標(biāo)題:Sony/索尼 WH-1000XM5 高解析度真無(wú)線降噪耳機(jī)
價(jià)格:2399.00
主圖:https://img.alicdn.com/imgextra/...
銷量:18234
想拿 SKU 庫(kù)存、優(yōu)惠券、評(píng)論數(shù)?把 fields 換成 skus,coupon_info,rate_count 即可,字段名官方文檔里全都有。
五、常見(jiàn)坑 & 小貼士
問(wèn)題 | 解決方案 |
---|---|
提示“權(quán)限不足” | 后臺(tái)→能力管理→勾選 taobao.item.get |
返回空值 | 檢查 num_iid 是否完整(11~12位數(shù)字) |
想批量抓 | 用線程池 + 隊(duì)列,官方 QPS=1,免費(fèi)額度 5000/日 |
怕超量 | 升級(jí)企業(yè)賬號(hào)或購(gòu)買(mǎi)流量包,100萬(wàn)次≈幾十元 |
六、再往前一步:把數(shù)據(jù)存起來(lái)
java
// 引入 MongoDB 驅(qū)動(dòng)
MongoCollection<Document> coll = MongoClients.create().getDatabase("tb").getCollection("item");
coll.insertOne(Document.parse(item.toString()));
一條命令入庫(kù),第二天就能用 MongoDB Compass 做可視化分析。
七、總結(jié):一句順口溜記住API
“數(shù)據(jù)不爬,接口去拿;簽名一算,JSON 到家?!?/blockquote>