京東關(guān)鍵詞搜索(item_search)技術(shù)實(shí)現(xiàn)指南:合規(guī) API 調(diào)用 + 數(shù)據(jù)運(yùn)營實(shí)戰(zhàn)
京東商品關(guān)鍵詞搜索(item_search)是電商技術(shù)從業(yè)者核心需求之一,需優(yōu)先采用京東官方開放平臺 API或合規(guī)第三方數(shù)據(jù)服務(wù)(避免直接爬取官網(wǎng),存在反爬封禁、法律風(fēng)險)。本文將從「接口接入、多語言代碼實(shí)現(xiàn)、數(shù)據(jù)提取、運(yùn)營落地」四個維度,提供可直接落地的技術(shù)方案,覆蓋選品、定價、庫存監(jiān)控等核心場景。
一、合規(guī)前提:京東 item_search 接口類型選擇
| 接口類型 | 適用場景 | 合規(guī)性 | 調(diào)用限制 | 核心優(yōu)勢 |
|---|---|---|---|---|
| 京東開放平臺「商品搜索接口」 | 自有店鋪運(yùn)營、官方數(shù)據(jù)對接 | 100% 合規(guī) | 需申請 AppKey,有 QPS 限制 | 數(shù)據(jù)權(quán)威、字段完整(含庫存 / 銷量 / 優(yōu)惠券) |
| 京東聯(lián)盟 API「商品搜索接口」 | 聯(lián)盟推廣、選品數(shù)據(jù)分析 | 100% 合規(guī) | 需聯(lián)盟賬號備案 | 支持傭金比例、推廣鏈接提取 |
| 第三方合規(guī)數(shù)據(jù)平臺 API | 快速驗(yàn)證需求、非店鋪運(yùn)營 | 合規(guī)(需資質(zhì)) | 按調(diào)用次數(shù)計費(fèi) | 接入門檻低、無需復(fù)雜備案 |
?? 重要提醒:京東官網(wǎng)(jd.com)禁止未經(jīng)授權(quán)的爬蟲抓取,輕則 IP 封禁,重則涉及《反不正當(dāng)競爭法》,優(yōu)先選擇上述合規(guī)接口!
二、京東開放平臺 item_search 接口接入流程(推薦)
1. 前期準(zhǔn)備
注冊京東開放平臺開發(fā)者賬號:https://open.jd.com/
創(chuàng)建應(yīng)用,申請「商品搜索」接口權(quán)限(需完成企業(yè) / 個人資質(zhì)認(rèn)證)
獲取核心憑證:AppKey、AppSecret(在應(yīng)用管理頁查看)
接口文檔參考:京東開放平臺 - 商品搜索接口(v3.0):https://open.jd.com/doc/api.htm?apiId=34526
2. 核心接口參數(shù)(item_search)
| 參數(shù)名 | 類型 | 必選 | 說明 | 示例值 |
|---|---|---|---|---|
| keyword | String | 是 | 搜索關(guān)鍵詞(支持多關(guān)鍵詞組合,空格分隔) | 「無線藍(lán)牙耳機(jī) 主動降噪」 |
| page | Int | 否 | 頁碼(默認(rèn) 1,最大支持 50 頁) | 1 |
| page_size | Int | 否 | 每頁條數(shù)(默認(rèn) 30,最大 50) | 50 |
| sort_type | String | 否 | 排序方式(price_asc:低價;price_desc:高價;sales_desc:銷量;review_desc:評價) | sales_desc |
| cat | String | 否 | 商品分類 ID(可通過「分類列表接口」獲?。?/td> | 6528(手機(jī)配件類) |
| is_promotion | Int | 否 | 是否只顯示促銷商品(1:是;0:否) | 1 |
3. 簽名算法(京東 API 核心驗(yàn)證步驟)
京東 API 采用HMAC-SHA256簽名機(jī)制,步驟如下:
按參數(shù)名 ASCII 升序排列所有請求參數(shù)(含公共參數(shù):app_key、timestamp、format 等)
拼接為「key=value&key=value」格式的字符串(無 url 編碼)
用AppSecret作為密鑰,對拼接字符串進(jìn)行 HMAC-SHA256 加密,得到簽名值(sign)
將簽名值加入請求參數(shù),以 GET/POST 方式提交請求
公共參數(shù)說明:必須包含app_key、timestamp(格式:yyyy-MM-dd HH:mm:ss)、format(默認(rèn) json)、v(接口版本,如 3.0)、sign(簽名值)
三、多語言代碼實(shí)現(xiàn)(item_search 接口調(diào)用)
以下代碼基于「京東開放平臺商品搜索接口 v3.0」,包含 Python/Java/PHP 三種主流語言,直接替換AppKey、AppSecret即可運(yùn)行。
1. Python 實(shí)現(xiàn)(推薦,含數(shù)據(jù)解析)
python
運(yùn)行
import requests import hashlib import hmac import time from urllib.parse import urlencode, quote_plus class JDItemSearch: def __init__(self, app_key, app_secret): self.app_key = app_key self.app_secret = app_secret self.url = "https://api.jd.com/routerjson" # 京東API網(wǎng)關(guān)地址 # 生成簽名 def generate_sign(self, params): # 按ASCII升序排序參數(shù) sorted_params = sorted(params.items(), key=lambda x: x[0]) # 拼接為key=value字符串(無url編碼) sign_str = "&".join([f"{k}={v}" for k, v in sorted_params]) # HMAC-SHA256加密 hmac_obj = hmac.new(self.app_secret.encode("utf-8"), sign_str.encode("utf-8"), hashlib.sha256) return hmac_obj.hexdigest().upper() # 執(zhí)行搜索 def search(self, keyword, page=1, page_size=30, sort_type="sales_desc"): # 公共參數(shù) params = { "app_key": self.app_key, "method": "jd.union.open.goods.search", # 京東聯(lián)盟搜索接口(或官方商品搜索接口) "format": "json", "v": "3.0", "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "keyword": keyword, "page": str(page), "page_size": str(page_size), "sort_type": sort_type } # 生成簽名 params["sign"] = self.generate_sign(params) # 發(fā)送請求 response = requests.get(self.url, params=params, timeout=10) if response.status_code == 200: return response.json() else: raise Exception(f"請求失?。籂顟B(tài)碼{response.status_code},響應(yīng)內(nèi)容{response.text}") # ------------------- 實(shí)戰(zhàn)調(diào)用 ------------------- if __name__ == "__main__": # 替換為你的AppKey和AppSecret APP_KEY = "你的京東開放平臺AppKey" APP_SECRET = "你的京東開放平臺AppSecret" jd_search = JDItemSearch(APP_KEY, APP_SECRET) # 搜索「無線藍(lán)牙耳機(jī) 主動降噪」,按銷量排序,第1頁,50條/頁 result = jd_search.search( keyword="無線藍(lán)牙耳機(jī) 主動降噪", page=1, page_size=50, sort_type="sales_desc" ) # 解析核心數(shù)據(jù)(選品/運(yùn)營關(guān)鍵字段) goods_list = result.get("jd_union_open_goods_search_response", {}).get("result", {}).get("data", []) for goods in goods_list: print("="*50) print(f"商品ID:{goods.get('skuId')}") print(f"商品標(biāo)題:{goods.get('goodsName')}") print(f"售價:{goods.get('price')}元") print(f"銷量:{goods.get('salesCount')}件") print(f"傭金比例:{goods.get('commissionRatio')}%") print(f"庫存狀態(tài):{'有貨' if goods.get('stock') > 0 else '缺貨'}") print(f"店鋪名稱:{goods.get('shopName')}") print(f"優(yōu)惠券金額:{goods.get('couponInfo', {}).get('discount', 0)}元")
2. Java 實(shí)現(xiàn)(含簽名工具類)
java
運(yùn)行
import org.apache.commons.codec.digest.HmacUtils;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import com.alibaba.fastjson.JSONObject;
import java.util.*;
public class JDItemSearch {
private static final String APP_KEY = "你的京東開放平臺AppKey";
private static final String APP_SECRET = "你的京東開放平臺AppSecret";
private static final String API_URL = "https://api.jd.com/routerjson";
// 生成簽名
private static String generateSign(Map params) {
// 按ASCII升序排序
List> entryList = new ArrayList?>(params.entrySet());
entryList.sort(Map.Entry.comparingByKey());
// 拼接字符串
StringBuilder signStr = new StringBuilder();
for (Map.Entry entry : entryList) {
signStr.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
signStr.deleteCharAt(signStr.length() - 1);
// HMAC-SHA256加密
return new HmacUtils("HmacSHA256", APP_SECRET).hmacHex(signStr.toString()).toUpperCase();
}
// 搜索商品
public static JSONObject search(String keyword, int page, int pageSize, String sortType) throws Exception {
Map params = new HashMap?>();
// 公共參數(shù)
params.put("app_key", APP_KEY);
params.put("method", "jd.union.open.goods.search");
params.put("format", "json");
params.put("v", "3.0");
params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
// 業(yè)務(wù)參數(shù)
params.put("keyword", keyword);
params.put("page", String.valueOf(page));
params.put("page_size", String.valueOf(pageSize));
params.put("sort_type", sortType);
// 生成簽名
params.put("sign", generateSign(params));
// 構(gòu)建請求URL
StringBuilder urlBuilder = new StringBuilder(API_URL).append("?");
for (Map.Entry entry : params.entrySet()) {
urlBuilder.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), "UTF-8")).append("&");
}
String url = urlBuilder.deleteCharAt(urlBuilder.length() - 1).toString();
// 發(fā)送請求
try (CloseableHttpClient client = HttpClients.createDefault()) {
HttpGet request = new HttpGet(url);
return JSONObject.parseObject(EntityUtils.toString(client.execute(request).getEntity()));
}
}
// 主函數(shù)調(diào)用
public static void main(String[] args) throws Exception {
JSONObject result = search("無線藍(lán)牙耳機(jī) 主動降噪", 1, 50, "sales_desc");
// 解析核心字段
JSONArray goodsList = result.getJSONObject("jd_union_open_goods_search_response")
.getJSONObject("result")
.getJSONArray("data");
for (Object obj : goodsList) {
JSONObject goods = (JSONObject) obj;
System.out.println("商品ID:" + goods.getString("skuId"));
System.out.println("商品標(biāo)題:" + goods.getString("goodsName"));
System.out.println("售價:" + goods.getBigDecimal("price") + "元");
System.out.println("銷量:" + goods.getIntValue("salesCount") + "件");
System.out.println("庫存狀態(tài):" + (goods.getIntValue("stock") > 0 ? "有貨" : "缺貨"));
System.out.println("---------------------");
}
}
}
3. PHP 實(shí)現(xiàn)(簡潔版)
php
運(yùn)行
?php
class JDItemSearch {
private $appKey = "你的京東開放平臺AppKey";
private $appSecret = "你的京東開放平臺AppSecret";
private $apiUrl = "https://api.jd.com/routerjson";
// 生成簽名
private function generateSign($params) {
ksort($params); // 按ASCII升序排序
$signStr = http_build_query($params, '', '&');
return strtoupper(hash_hmac('sha256', $signStr, $this-?>appSecret));
}
// 搜索商品
public function search($keyword, $page = 1, $pageSize = 30, $sortType = "sales_desc") {
$params = [
'app_key' => $this->appKey,
'method' => 'jd.union.open.goods.search',
'format' => 'json',
'v' => '3.0',
'timestamp' => date('Y-m-d H:i:s'),
'keyword' => $keyword,
'page' => (string)$page,
'page_size' => (string)$pageSize,
'sort_type' => $sortType
];
$params['sign'] = $this->generateSign($params);
// 發(fā)送請求
$url = $this->apiUrl . '?' . http_build_query($params);
$response = file_get_contents($url);
return json_decode($response, true);
}
}
// 調(diào)用示例
$jdSearch = new JDItemSearch();
$result = $jdSearch->search("無線藍(lán)牙耳機(jī) 主動降噪", 1, 50, "sales_desc");
// 解析數(shù)據(jù)
$goodsList = $result['jd_union_open_goods_search_response']['result']['data'] ?? [];
foreach ($goodsList as $goods) {
echo "商品ID:" . $goods['skuId'] . "n";
echo "商品標(biāo)題:" . $goods['goodsName'] . "n";
echo "售價:" . $goods['price'] . "元n";
echo "銷量:" . $goods['salesCount'] . "件n";
echo "-----------------n";
}
?>
四、數(shù)據(jù)提取與運(yùn)營實(shí)戰(zhàn)(選品 / 定價 / 庫存)
調(diào)用接口后,核心是從返回數(shù)據(jù)中提取運(yùn)營關(guān)鍵字段,并落地到業(yè)務(wù)場景:
1. 核心字段提?。↗SON 結(jié)構(gòu)示例)
json
{
"jd_union_open_goods_search_response": {
"result": {
"data": [
{
"skuId": "100062888888", // 商品唯一ID(關(guān)鍵)
"goodsName": "無線藍(lán)牙耳機(jī) 主動降噪...", // 商品標(biāo)題
"price": 299.00, // 現(xiàn)價
"originalPrice": 399.00, // 原價
"salesCount": 12560, // 累計銷量
"reviewCount": 3280, // 評價數(shù)
"stock": 568, // 庫存數(shù)量
"shopName": "XX官方旗艦店", // 店鋪名稱
"shopType": "JD_MALL", // 店鋪類型(京東自營/第三方)
"commissionRatio": 15.00, // 傭金比例(聯(lián)盟API特有)
"couponInfo": {
"discount": 50, // 優(yōu)惠券金額
"startTime": "2024-01-01", // 優(yōu)惠券生效時間
"endTime": "2024-01-31" // 優(yōu)惠券失效時間
},
"categoryId": "6528", // 分類ID
"brandName": "XX品牌" // 品牌名稱
}
]
}
}
}
2. 運(yùn)營場景落地
(1)選品分析(高銷量低競爭)
篩選條件:salesCount > 5000(高銷量)、reviewCount/salesCount < 0.3(低評價占比,競爭?。ouponInfo.discount > 30(有大額優(yōu)惠券)
代碼示例(Python):
python
運(yùn)行
# 篩選高銷量、大額券、低競爭商品
high_potential_goods = []
for goods in goods_list:
sales = goods.get('salesCount', 0)
review = goods.get('reviewCount', 0)
coupon = goods.get('couponInfo', {}).get('discount', 0)
# 篩選條件
if sales > 5000 and coupon > 30 and (review/sales < 0.3 if sales > 0 else False):
high_potential_goods.append({
'skuId': goods['skuId'],
'goodsName': goods['goodsName'],
'price': goods['price'],
'sales': sales,
'coupon': coupon
})
print("高潛力選品:", high_potential_goods)
(2)定價策略參考
提取同類商品價格區(qū)間:min_price = min([g['price'] for g in goods_list])、max_price = max([g['price'] for g in goods_list])
定價建議:若為第三方店鋪,定價可低于區(qū)間均值 5%-10%;若為自營,可參考區(qū)間中位數(shù),搭配優(yōu)惠券提升競爭力。
(3)庫存監(jiān)控
實(shí)時監(jiān)控爆款庫存:for goods in goods_list: if goods['salesCount'] > 10000: print(f"爆款{goods['goodsName']}庫存:{goods['stock']}")
觸發(fā)預(yù)警:當(dāng)庫存goods['stock'] < 100時,發(fā)送郵件 / 短信提醒補(bǔ)貨。
五、常見問題與解決方案
| 問題類型 | 原因分析 | 解決方案 |
|---|---|---|
| 簽名錯誤(sign invalid) | 參數(shù)排序錯誤、AppSecret 錯誤 | 嚴(yán)格按 ASCII 升序排序參數(shù),核對 AppSecret 是否正確 |
| 調(diào)用頻率限制(QPS 超限) | 超過平臺規(guī)定的 QPS 上限 | 1. 申請?zhí)岣?QPS;2. 加入請求重試機(jī)制(帶延遲);3. 緩存重復(fù)搜索結(jié)果 |
| 數(shù)據(jù)返回為空 | 關(guān)鍵詞無匹配商品、權(quán)限不足 | 1. 優(yōu)化關(guān)鍵詞(更具體);2. 檢查接口權(quán)限是否開通 |
| 庫存 / 銷量字段缺失 | 接口版本過低 | 升級到 v3.0 及以上版本,確認(rèn)接口權(quán)限包含「銷量 / 庫存」字段 |
六、合規(guī)與風(fēng)險提示
禁止使用爬蟲爬取京東官網(wǎng)(jd.com)、京東超市等非開放平臺頁面,僅允許調(diào)用官方開放平臺或合規(guī)第三方 API。
數(shù)據(jù)使用范圍:僅用于自身店鋪運(yùn)營、選品分析,不得泄露、轉(zhuǎn)售他人數(shù)據(jù),遵守《京東開放平臺服務(wù)協(xié)議》。
接口調(diào)用規(guī)范:嚴(yán)格遵守 QPS 限制,避免高頻次惡意調(diào)用,否則會導(dǎo)致 AppKey 封禁。
審核編輯 黃宇
-
API
+關(guān)注
關(guān)注
2文章
2371瀏覽量
66772 -
京東
+關(guān)注
關(guān)注
2文章
1108瀏覽量
50077
發(fā)布評論請先 登錄
京東關(guān)鍵詞item_search-按關(guān)鍵字搜索京東商品
評論