京東item_search_pro是官方推出的增強(qiáng)版關(guān)鍵詞搜索 API,相比基礎(chǔ)版item_search,其核心優(yōu)勢(shì)在于「字段更全、篩選維度更多、數(shù)據(jù)精度更高」(支持品牌、價(jià)格區(qū)間、服務(wù)標(biāo)簽等多維度精準(zhǔn)篩選,返回商品規(guī)格、售后保障、店鋪評(píng)分等深度數(shù)據(jù)),適用于中高階選品分析、競(jìng)品監(jiān)控、精細(xì)化運(yùn)營等場(chǎng)景。本文將從「接口特性、合規(guī)接入、多語言進(jìn)階代碼、高級(jí)數(shù)據(jù)解析、實(shí)戰(zhàn)場(chǎng)景落地」五大維度,提供可直接落地的技術(shù)方案。
一、item_search_pro 核心優(yōu)勢(shì)與適用場(chǎng)景
1. 核心優(yōu)勢(shì)(對(duì)比基礎(chǔ)版 item_search)
| 特性 | item_search(基礎(chǔ)版) | item_search_pro(增強(qiáng)版) |
|---|---|---|
| 篩選維度 | 僅支持關(guān)鍵詞、排序、分類 | 支持品牌、價(jià)格區(qū)間、服務(wù)標(biāo)簽、規(guī)格、產(chǎn)地等 10 + 維度 |
| 返回字段數(shù)量 | 基礎(chǔ)字段(價(jià)格、銷量、庫存) | 新增店鋪評(píng)分、商品規(guī)格、售后政策、實(shí)時(shí)銷量、物流信息等 30 + 字段 |
| 數(shù)據(jù)精度 | 累計(jì)銷量、基礎(chǔ)價(jià)格 | 實(shí)時(shí)銷量(近 7 天 / 30 天)、優(yōu)惠后實(shí)際價(jià)格、規(guī)格對(duì)應(yīng)價(jià)格 |
| 批量查詢支持 | 單關(guān)鍵詞單次查詢 | 支持多關(guān)鍵詞批量查詢、分頁批量獲?。ㄗ畲笾С?100 頁) |
| 適用場(chǎng)景 | 簡單選品、基礎(chǔ)數(shù)據(jù)監(jiān)控 | 精細(xì)化選品、競(jìng)品深度分析、定價(jià)策略優(yōu)化、服務(wù)對(duì)標(biāo) |
2. 合規(guī)接入前提
item_search_pro屬于京東開放平臺(tái)高級(jí)接口,需滿足以下條件:
已注冊(cè)京東開放平臺(tái)開發(fā)者賬號(hào)(企業(yè) / 個(gè)人資質(zhì)認(rèn)證通過);
已創(chuàng)建應(yīng)用并申請(qǐng)「商品搜索增強(qiáng)版」接口權(quán)限(需單獨(dú)申請(qǐng),基礎(chǔ)版權(quán)限不包含);
核心憑證:AppKey、AppSecret(與基礎(chǔ)版通用,無需重新申請(qǐng));
官方文檔參考:京東開放平臺(tái) - item_search_pro 接口(v4.0):https://open.jd.com/doc/api.htm?apiId=45487
二、item_search_pro 接口核心配置(參數(shù) + 簽名)
1. 公共參數(shù)(與基礎(chǔ)版一致)
| 參數(shù)名 | 類型 | 必選 | 說明 | 示例值 |
|---|---|---|---|---|
| app_key | String | 是 | 應(yīng)用唯一標(biāo)識(shí)(應(yīng)用管理頁獲?。?/td> | 23456789(替換為實(shí)際值) |
| method | String | 是 | 接口名稱(pro 版固定值) | jd.union.open.goods.search.pro |
| format | String | 否 | 響應(yīng)格式(默認(rèn) json) | json |
| v | String | 是 | 接口版本(pro 版推薦 v4.0) | 4.0 |
| timestamp | String | 是 | 請(qǐng)求時(shí)間戳(格式:yyyy-MM-dd HH:mm:ss) | 2024-08-20 15:30:00 |
| sign | String | 是 | 簽名值(HMAC-SHA256 算法) | 8F7A6B5C4D3E2F1A... |
2. 專屬高級(jí)參數(shù)(pro 版核心亮點(diǎn))
| 參數(shù)名 | 類型 | 必選 | 說明 | 示例值 |
|---|---|---|---|---|
| keyword | String | 是 | 搜索關(guān)鍵詞(支持多關(guān)鍵詞,空格分隔) | 無線藍(lán)牙耳機(jī) 主動(dòng)降噪 長續(xù)航 |
| page | Int | 否 | 頁碼(默認(rèn) 1,最大 100 頁) | 2 |
| page_size | Int | 否 | 每頁條數(shù)(默認(rèn) 30,最大 100) | 100 |
| sort_type | String | 否 | 排序方式(新增 real_sales:實(shí)時(shí)銷量) | real_sales_desc(實(shí)時(shí)銷量降序) |
| brand_id | String | 否 | 品牌 ID(精準(zhǔn)篩選特定品牌,多品牌用逗號(hào)分隔) | 12345,67890(需通過品牌列表接口獲?。?/td> |
| price_from | Float | 否 | 最低價(jià)格(元) | 100.00 |
| price_to | Float | 否 | 最高價(jià)格(元) | 300.00 |
| service_tags | String | 否 | 服務(wù)標(biāo)簽(多標(biāo)簽用逗號(hào)分隔,需參考標(biāo)簽 ID 字典) | 1,3,5(1 = 京東物流,3=7 天無理由,5 = 上門換新) |
| is_jd_logistics | Int | 否 | 是否京東物流(1 = 是,0 = 否) | 1 |
| spec_ids | String | 否 | 規(guī)格 ID(篩選特定規(guī)格,如顏色、內(nèi)存) | 8GB+256GB, 黑色(需通過商品規(guī)格接口獲?。?/td> |
| province | String | 否 | 省份(篩選區(qū)域庫存 / 價(jià)格) | 廣東省 |
關(guān)鍵說明:
brand_id獲取:調(diào)用京東開放平臺(tái)「品牌列表接口」(jd.union.open.category.brand.get),根據(jù)分類 ID 查詢品牌 ID;
service_tags標(biāo)簽 ID 字典:可在京東開放平臺(tái)接口文檔中下載,包含京東物流、售后保障、發(fā)票服務(wù)等所有支持的標(biāo)簽 ID;
spec_ids:需先通過「商品規(guī)格接口」獲取目標(biāo)商品的規(guī)格 ID,再用于篩選。
3. 簽名算法(與基礎(chǔ)版一致,無需修改)
按參數(shù)名 ASCII 升序排列所有請(qǐng)求參數(shù)(含公共參數(shù) + 業(yè)務(wù)參數(shù));
拼接為「key=value&key=value」格式字符串(無 URL 編碼);
用AppSecret作為密鑰,執(zhí)行 HMAC-SHA256 加密,得到大寫簽名值(sign);
將 sign 加入請(qǐng)求參數(shù),以 GET/POST 方式提交。
三、多語言進(jìn)階代碼實(shí)現(xiàn)(item_search_pro)
以下代碼基于京東開放平臺(tái)item_search_pro(v4.0),包含高級(jí)參數(shù)配置、批量查詢、數(shù)據(jù)入庫功能,直接替換AppKey、AppSecret即可運(yùn)行。
1. Python 實(shí)現(xiàn)(推薦,含批量搜索 + MySQL 入庫)
python
運(yùn)行
import requests import hashlib import hmac import time import pymysql from urllib.parse import urlencode from typing import List, Dict class JDItemSearchPro: def __init__(self, app_key: str, app_secret: str, db_config: Dict = None): self.app_key = app_key self.app_secret = app_secret self.api_url = "https://api.jd.com/routerjson" # 數(shù)據(jù)庫連接(可選,用于存儲(chǔ)數(shù)據(jù)) self.db = pymysql.connect(**db_config) if db_config else None self.cursor = self.db.cursor() if self.db else None # 生成簽名(核心方法) def generate_sign(self, params: Dict) -> str: sorted_params = sorted(params.items(), key=lambda x: x[0]) sign_str = "&".join([f"{k}={v}" for k, v in sorted_params]) hmac_obj = hmac.new( self.app_secret.encode("utf-8"), sign_str.encode("utf-8"), hashlib.sha256 ) return hmac_obj.hexdigest().upper() # 單關(guān)鍵詞搜索(支持高級(jí)篩選) def search_single_keyword(self, keyword: str, **kwargs) -> Dict: """ kwargs支持的高級(jí)參數(shù): page: 頁碼,default=1 page_size: 每頁條數(shù),default=100 sort_type: 排序方式,default=real_sales_desc brand_id: 品牌ID,default="" price_from: 最低價(jià)格,default=0.0 price_to: 最高價(jià)格,default=99999.0 service_tags: 服務(wù)標(biāo)簽,default="" is_jd_logistics: 是否京東物流,default=1 """ # 公共參數(shù) params = { "app_key": self.app_key, "method": "jd.union.open.goods.search.pro", "format": "json", "v": "4.0", "timestamp": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), "keyword": keyword, "page": str(kwargs.get("page", 1)), "page_size": str(kwargs.get("page_size", 100)), "sort_type": kwargs.get("sort_type", "real_sales_desc"), "brand_id": kwargs.get("brand_id", ""), "price_from": str(kwargs.get("price_from", 0.0)), "price_to": str(kwargs.get("price_to", 99999.0)), "service_tags": kwargs.get("service_tags", ""), "is_jd_logistics": str(kwargs.get("is_jd_logistics", 1)) } # 生成簽名 params["sign"] = self.generate_sign(params) # 發(fā)送請(qǐng)求 response = requests.get(self.api_url, params=params, timeout=15) if response.status_code == 200: return response.json() else: raise Exception(f"請(qǐng)求失?。籂顟B(tài)碼{response.status_code},響應(yīng):{response.text}") # 多關(guān)鍵詞批量搜索 def batch_search(self, keywords: List[str], **kwargs) -> List[Dict]: """批量搜索多個(gè)關(guān)鍵詞,返回合并后的數(shù)據(jù)""" all_goods = [] for keyword in keywords: print(f"正在搜索關(guān)鍵詞:{keyword}") for page in range(1, kwargs.get("max_page", 3) + 1): # 最多獲取3頁 try: result = self.search_single_keyword( keyword=keyword, page=page, page_size=kwargs.get("page_size", 100), sort_type=kwargs.get("sort_type", "real_sales_desc"), brand_id=kwargs.get("brand_id", ""), price_from=kwargs.get("price_from", 0.0), price_to=kwargs.get("price_to", 99999.0), service_tags=kwargs.get("service_tags", ""), is_jd_logistics=kwargs.get("is_jd_logistics", 1) ) # 解析數(shù)據(jù) goods_list = self.parse_result(result) if not goods_list: break # 無更多數(shù)據(jù),停止分頁 all_goods.extend(goods_list) # 存入數(shù)據(jù)庫(如果配置了DB) if self.db: self.save_to_db(goods_list) time.sleep(1) # 避免QPS超限 except Exception as e: print(f"關(guān)鍵詞{keyword}第{page}頁搜索失?。簕str(e)}") continue return all_goods # 解析返回結(jié)果(提取pro版核心字段) def parse_result(self, result: Dict) -> List[Dict]: """提取商品核心字段,適配運(yùn)營需求""" parsed_goods = [] data = result.get("jd_union_open_goods_search_pro_response", {}) .get("result", {}) .get("data", []) for goods in data: # 解析規(guī)格信息(pro版新增) spec_info = goods.get("specInfo", {}) spec_details = "; ".join([f"{k}:{v}" for k, v in spec_info.items()]) if spec_info else "無" # 解析售后保障(pro版新增) after_sale = goods.get("afterSaleService", {}) after_sale_details = f"7天無理由:{'是' if after_sale.get('sevenDaysNoReasonReturn') else '否'};" f"上門換新:{'是' if after_sale.get('onSiteReplacement') else '否'};" f"全國聯(lián)保:{'是' if after_sale.get('nationalWarranty') else '否'}" parsed_goods.append({ "sku_id": goods.get("skuId", ""), # 商品唯一ID "goods_name": goods.get("goodsName", ""), # 商品標(biāo)題 "brand_name": goods.get("brandName", ""), # 品牌名稱 "brand_id": goods.get("brandId", ""), # 品牌ID "current_price": goods.get("price", 0.0), # 現(xiàn)價(jià) "original_price": goods.get("originalPrice", 0.0), # 原價(jià) "real_sales_7d": goods.get("realSales7d", 0), # 7天實(shí)時(shí)銷量(pro新增) "total_sales": goods.get("salesCount", 0), # 累計(jì)銷量 "review_count": goods.get("reviewCount", 0), # 評(píng)價(jià)數(shù) "shop_name": goods.get("shopName", ""), # 店鋪名稱 "shop_type": goods.get("shopType", ""), # 店鋪類型(自營/第三方) "shop_score": goods.get("shopScore", 0.0), # 店鋪評(píng)分(pro新增) "stock": goods.get("stock", 0), # 庫存 "is_jd_logistics": goods.get("isJdLogistics", 0), # 是否京東物流 "service_tags": goods.get("serviceTags", ""), # 服務(wù)標(biāo)簽 "spec_details": spec_details, # 規(guī)格詳情 "after_sale_details": after_sale_details, # 售后詳情 "coupon_amount": goods.get("couponInfo", {}).get("discount", 0.0), # 優(yōu)惠券金額 "create_time": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 數(shù)據(jù)采集時(shí)間 }) return parsed_goods # 數(shù)據(jù)存入MySQL(可選) def save_to_db(self, goods_list: List[Dict]): """創(chuàng)建商品數(shù)據(jù)表并插入數(shù)據(jù)""" # 創(chuàng)建表SQL create_table_sql = """ CREATE TABLE IF NOT EXISTS jd_goods_pro ( id INT AUTO_INCREMENT PRIMARY KEY, sku_id VARCHAR(50) UNIQUE NOT NULL, goods_name VARCHAR(500) NOT NULL, brand_name VARCHAR(100), brand_id VARCHAR(50), current_price DECIMAL(10,2), original_price DECIMAL(10,2), real_sales_7d INT, total_sales INT, review_count INT, shop_name VARCHAR(200), shop_type VARCHAR(50), shop_score DECIMAL(3,2), stock INT, is_jd_logistics TINYINT, service_tags VARCHAR(200), spec_details VARCHAR(500), after_sale_details VARCHAR(500), coupon_amount DECIMAL(10,2), create_time DATETIME ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; """ self.cursor.execute(create_table_sql) # 插入數(shù)據(jù)SQL insert_sql = """ INSERT IGNORE INTO jd_goods_pro ( sku_id, goods_name, brand_name, brand_id, current_price, original_price, real_sales_7d, total_sales, review_count, shop_name, shop_type, shop_score, stock, is_jd_logistics, service_tags, spec_details, after_sale_details, coupon_amount, create_time ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) """ # 批量插入 values = [ ( g["sku_id"], g["goods_name"], g["brand_name"], g["brand_id"], g["current_price"], g["original_price"], g["real_sales_7d"], g["total_sales"], g["review_count"], g["shop_name"], g["shop_type"], g["shop_score"], g["stock"], g["is_jd_logistics"], g["service_tags"], g["spec_details"], g["after_sale_details"], g["coupon_amount"], g["create_time"] ) for g in goods_list ] self.cursor.executemany(insert_sql, values) self.db.commit() print(f"成功存入{len(values)}條商品數(shù)據(jù)") # ------------------- 實(shí)戰(zhàn)調(diào)用示例 ------------------- if __name__ == "__main__": # 配置信息(替換為實(shí)際值) APP_KEY = "你的京東AppKey" APP_SECRET = "你的京東AppSecret" DB_CONFIG = { "host": "localhost", "user": "root", "password": "你的數(shù)據(jù)庫密碼", "database": "jd_data", "charset": "utf8mb4" } # 初始化實(shí)例(如需存儲(chǔ)數(shù)據(jù),傳入DB_CONFIG;無需則不傳) jd_pro = JDItemSearchPro(APP_KEY, APP_SECRET, DB_CONFIG) # 1. 單關(guān)鍵詞高級(jí)搜索(篩選京東物流、100-300元、華為品牌) single_result = jd_pro.search_single_keyword( keyword="無線藍(lán)牙耳機(jī) 主動(dòng)降噪", brand_id="1000000779", # 華為品牌ID(示例) price_from=100.0, price_to=300.0, service_tags="1,3", # 1=京東物流,3=7天無理由 sort_type="real_sales_desc" ) parsed_single = jd_pro.parse_result(single_result) print(f"單關(guān)鍵詞搜索結(jié)果:{len(parsed_single)}條商品") # 2. 多關(guān)鍵詞批量搜索(存儲(chǔ)到MySQL) keywords = ["無線藍(lán)牙耳機(jī) 主動(dòng)降噪", "機(jī)械鍵盤 青軸", "充電寶 20000mAh"] batch_result = jd_pro.batch_search( keywords=keywords, max_page=2, # 每個(gè)關(guān)鍵詞獲取2頁 page_size=100, price_from=50.0, is_jd_logistics=1 ) print(f"批量搜索總結(jié)果:{len(batch_result)}條商品") # 關(guān)閉數(shù)據(jù)庫連接 if jd_pro.db: jd_pro.cursor.close() jd_pro.db.close()
2. Java 實(shí)現(xiàn)(含高級(jí)篩選 + 數(shù)據(jù)解析)
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 com.alibaba.fastjson.JSONArray;
import java.util.*;
import java.net.URLEncoder;
public class JDItemSearchPro {
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) {
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);
return new HmacUtils("HmacSHA256", APP_SECRET).hmacHex(signStr.toString()).toUpperCase();
}
// 高級(jí)搜索方法(支持多維度篩選)
public static JSONObject searchPro(String keyword, int page, int pageSize, String brandId,
double priceFrom, double priceTo, String serviceTags, int isJdLogistics) throws Exception {
Map params = new HashMap?>();
// 公共參數(shù)
params.put("app_key", APP_KEY);
params.put("method", "jd.union.open.goods.search.pro");
params.put("format", "json");
params.put("v", "4.0");
params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
// 業(yè)務(wù)參數(shù)(高級(jí)篩選)
params.put("keyword", keyword);
params.put("page", String.valueOf(page));
params.put("page_size", String.valueOf(pageSize));
params.put("sort_type", "real_sales_desc");
params.put("brand_id", brandId);
params.put("price_from", String.valueOf(priceFrom));
params.put("price_to", String.valueOf(priceTo));
params.put("service_tags", serviceTags);
params.put("is_jd_logistics", String.valueOf(isJdLogistics));
// 生成簽名
params.put("sign", generateSign(params));
// 構(gòu)建請(qǐng)求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ā)送請(qǐng)求
try (CloseableHttpClient client = HttpClients.createDefault()) {
HttpGet request = new HttpGet(url);
return JSONObject.parseObject(EntityUtils.toString(client.execute(request).getEntity()));
}
}
// 解析Pro版核心數(shù)據(jù)
public static List> parseProResult(JSONObject result) {
List> parsedGoods = new ArrayList?>();
JSONArray data = result.getJSONObject("jd_union_open_goods_search_pro_response")
.getJSONObject("result")
.getJSONArray("data");
for (Object obj : data) {
JSONObject goods = (JSONObject) obj;
Map goodsMap = new HashMap?>();
// 基礎(chǔ)字段
goodsMap.put("skuId", goods.getString("skuId"));
goodsMap.put("goodsName", goods.getString("goodsName"));
goodsMap.put("brandName", goods.getString("brandName"));
goodsMap.put("currentPrice", goods.getBigDecimal("price"));
goodsMap.put("originalPrice", goods.getBigDecimal("originalPrice"));
// Pro版新增字段
goodsMap.put("realSales7d", goods.getIntValue("realSales7d"));
goodsMap.put("shopScore", goods.getBigDecimal("shopScore"));
goodsMap.put("specDetails", goods.getJSONObject("specInfo").toString());
goodsMap.put("afterSaleDetails", goods.getJSONObject("afterSaleService").toString());
goodsMap.put("isJdLogistics", goods.getIntValue("isJdLogistics"));
parsedGoods.add(goodsMap);
}
return parsedGoods;
}
// 主函數(shù)調(diào)用
public static void main(String[] args) throws Exception {
// 搜索:華為無線藍(lán)牙耳機(jī)(品牌ID=1000000779),100-300元,京東物流
JSONObject result = searchPro(
"無線藍(lán)牙耳機(jī) 主動(dòng)降噪",
1, 100,
"1000000779",
100.0, 300.0,
"1,3", 1
);
// 解析數(shù)據(jù)
List> goodsList = parseProResult(result);
System.out.println("搜索結(jié)果數(shù)量:" + goodsList.size());
for (Map goods : goodsList) {
System.out.println("商品ID:" + goods.get("skuId"));
System.out.println("商品名稱:" + goods.get("goodsName"));
System.out.println("7天實(shí)時(shí)銷量:" + goods.get("realSales7d"));
System.out.println("店鋪評(píng)分:" + goods.get("shopScore"));
System.out.println("---------------------");
}
}
}
3. PHP 實(shí)現(xiàn)(簡潔版,含高級(jí)參數(shù))
php
運(yùn)行
?php
class JDItemSearchPro {
private $appKey = "你的京東AppKey";
private $appSecret = "你的京東AppSecret";
private $apiUrl = "https://api.jd.com/routerjson";
// 生成簽名
private function generateSign($params) {
ksort($params);
$signStr = http_build_query($params, '', '&');
return strtoupper(hash_hmac('sha256', $signStr, $this-?>appSecret));
}
// 高級(jí)搜索
public function searchPro($keyword, $page = 1, $pageSize = 100, $brandId = '', $priceFrom = 0, $priceTo = 99999, $serviceTags = '', $isJdLogistics = 1) {
$params = [
'app_key' => $this->appKey,
'method' => 'jd.union.open.goods.search.pro',
'format' => 'json',
'v' => '4.0',
'timestamp' => date('Y-m-d H:i:s'),
'keyword' => $keyword,
'page' => (string)$page,
'page_size' => (string)$pageSize,
'sort_type' => 'real_sales_desc',
'brand_id' => $brandId,
'price_from' => (string)$priceFrom,
'price_to' => (string)$priceTo,
'service_tags' => $serviceTags,
'is_jd_logistics' => (string)$isJdLogistics
];
$params['sign'] = $this->generateSign($params);
// 發(fā)送請(qǐng)求
$url = $this->apiUrl . '?' . http_build_query($params);
$response = file_get_contents($url);
return json_decode($response, true);
}
// 解析數(shù)據(jù)
public function parseResult($result) {
$goodsList = $result['jd_union_open_goods_search_pro_response']['result']['data'] ?? [];
$parsed = [];
foreach ($goodsList as $goods) {
$parsed[] = [
'sku_id' => $goods['skuId'],
'goods_name' => $goods['goodsName'],
'brand_name' => $goods['brandName'],
'current_price' => $goods['price'],
'real_sales_7d' => $goods['realSales7d'],
'shop_score' => $goods['shopScore'],
'spec_details' => json_encode($goods['specInfo']),
'after_sale' => json_encode($goods['afterSaleService'])
];
}
return $parsed;
}
}
// 調(diào)用示例
$jdPro = new JDItemSearchPro();
$result = $jdPro->searchPro(
'無線藍(lán)牙耳機(jī) 主動(dòng)降噪',
1, 100,
'1000000779', // 華為品牌ID
100, 300,
'1,3', 1
);
$parsedData = $jdPro->parseResult($result);
print_r("搜索結(jié)果:" . count($parsedData) . "條n");
print_r($parsedData[0]);
?>
四、item_search_pro 核心數(shù)據(jù)解析與運(yùn)營落地
1. Pro 版新增核心字段(運(yùn)營關(guān)鍵)
| 字段名 | 說明 | 運(yùn)營價(jià)值 |
|---|---|---|
| realSales7d/realSales30d | 7 天 / 30 天實(shí)時(shí)銷量(非累計(jì)) | 判斷商品近期熱度,避免選品 “過時(shí)爆款” |
| shopScore | 店鋪評(píng)分(1-5 分) | 篩選高口碑店鋪,降低合作 / 對(duì)標(biāo)風(fēng)險(xiǎn) |
| specInfo | 商品規(guī)格詳情(顏色、內(nèi)存、尺寸等) | 分析熱門規(guī)格,優(yōu)化自身商品 SKU 配置 |
| afterSaleService | 售后保障(7 天無理由、上門換新等) | 對(duì)標(biāo)競(jìng)品服務(wù),提升自身店鋪售后競(jìng)爭(zhēng)力 |
| isJdLogistics | 是否京東物流(1 = 是) | 篩選高物流體驗(yàn)商品,適合主打 “極速送達(dá)” 場(chǎng)景 |
| couponEffectiveTime | 優(yōu)惠券生效 / 失效時(shí)間 | 精準(zhǔn)把握促銷節(jié)點(diǎn),調(diào)整定價(jià) / 推廣策略 |
2. 高階運(yùn)營場(chǎng)景落地(基于 Pro 版數(shù)據(jù))
(1)精細(xì)化選品(精準(zhǔn)鎖定高潛力商品)
篩選邏輯:京東物流(is_jd_logistics=1)+ 7 天實(shí)時(shí)銷量 > 500(realSales7d>500)+ 店鋪評(píng)分 > 4.8(shopScore>4.8)+ 有上門換新服務(wù)(afterSaleService.onSiteReplacement=true)+ 價(jià)格區(qū)間 100-300 元。Python 代碼示例:
python
運(yùn)行
# 篩選高潛力商品
high_potential = [
g for g in parsed_single
if g["real_sales_7d"] > 500
and g["shop_score"] > 4.8
and "上門換新:是" in g["after_sale_details"]
and 100 <= g["current_price"] <= 300
]
print(f"高潛力商品數(shù)量:{len(high_potential)}")
for goods in high_potential:
print(f"商品:{goods['goods_name']},7天銷量:{goods['real_sales_7d']},店鋪評(píng)分:{goods['shop_score']}")
(2)競(jìng)品服務(wù)對(duì)標(biāo)分析
核心需求:分析競(jìng)品的售后保障、服務(wù)標(biāo)簽,優(yōu)化自身店鋪服務(wù)配置。數(shù)據(jù)提取邏輯:提取同類競(jìng)品的service_tags和after_sale_details,統(tǒng)計(jì)高頻服務(wù)標(biāo)簽和售后政策。代碼示例:
python
運(yùn)行
# 統(tǒng)計(jì)競(jìng)品高頻服務(wù)標(biāo)簽
service_tags_count = {}
for goods in batch_result:
tags = goods["service_tags"].split(",")
for tag in tags:
if tag:
service_tags_count[tag] = service_tags_count.get(tag, 0) + 1
# 統(tǒng)計(jì)售后政策分布
after_sale_count = {"7天無理由": 0, "上門換新": 0, "全國聯(lián)保": 0}
for goods in batch_result:
if "7天無理由:是" in goods["after_sale_details"]:
after_sale_count["7天無理由"] += 1
if "上門換新:是" in goods["after_sale_details"]:
after_sale_count["上門換新"] += 1
if "全國聯(lián)保:是" in goods["after_sale_details"]:
after_sale_count["全國聯(lián)保"] += 1
print("競(jìng)品服務(wù)標(biāo)簽分布:", service_tags_count)
print("競(jìng)品售后政策分布:", after_sale_count)
(3)動(dòng)態(tài)定價(jià)策略優(yōu)化
核心邏輯:基于同類商品的價(jià)格區(qū)間、優(yōu)惠券金額、規(guī)格配置,制定差異化定價(jià)。
提取同類商品價(jià)格區(qū)間:min_price = min([g["current_price"] for g in batch_result]),max_price = max([g["current_price"] for g in batch_result]);
熱門規(guī)格溢價(jià)分析:若 “8GB+256GB” 規(guī)格的商品價(jià)格比 “6GB+128GB” 高 30% 以上,可適當(dāng)降低溢價(jià),提升競(jìng)爭(zhēng)力。
五、常見問題與解決方案(Pro 版專屬)
| 問題類型 | 原因分析 | 解決方案 |
|---|---|---|
| 接口權(quán)限不足(403) | 未申請(qǐng)「商品搜索增強(qiáng)版」權(quán)限,僅擁有基礎(chǔ)版 | 登錄京東開放平臺(tái),在 “應(yīng)用權(quán)限管理” 中申請(qǐng) item_search_pro 權(quán)限 |
| realSales7d 字段缺失 | 接口版本低于 v4.0,或未開通實(shí)時(shí)銷量權(quán)限 | 升級(jí)接口版本至 v4.0,申請(qǐng) “實(shí)時(shí)銷量數(shù)據(jù)” 權(quán)限 |
| brand_id 篩選無效 | 品牌 ID 錯(cuò)誤,或該品牌無匹配商品 | 通過「品牌列表接口」重新獲取品牌 ID,優(yōu)化關(guān)鍵詞 + 品牌組合 |
| 分頁數(shù)據(jù)重復(fù) | 未按 sku_id 去重,或接口返回?cái)?shù)據(jù)緩存 | 存入數(shù)據(jù)庫時(shí)用 sku_id 作為唯一鍵(INSERT IGNORE),或添加去重邏輯 |
| QPS 超限(429) | 超過 Pro 版 QPS 限制(通常為 10-20 QPS) | 1. 申請(qǐng)?zhí)岣?QPS;2. 批量查詢時(shí)加入 1-2 秒延遲;3. 緩存重復(fù)查詢結(jié)果 |
六、合規(guī)與風(fēng)險(xiǎn)提示
接口使用限制:item_search_pro的 QPS 限制高于基礎(chǔ)版,但仍需遵守平臺(tái)規(guī)定,禁止高頻惡意調(diào)用(否則會(huì)導(dǎo)致 AppKey 封禁);
數(shù)據(jù)使用范圍:僅用于自身運(yùn)營分析,不得轉(zhuǎn)售、泄露商品數(shù)據(jù)或店鋪信息,遵守《京東開放平臺(tái)服務(wù)協(xié)議》;
權(quán)限有效期:高級(jí)接口權(quán)限需定期審核,確保資質(zhì)合規(guī),避免權(quán)限到期導(dǎo)致服務(wù)中斷。
審核編輯 黃宇
-
API
+關(guān)注
關(guān)注
2文章
2383瀏覽量
66818 -
京東
+關(guān)注
關(guān)注
2文章
1114瀏覽量
50091
發(fā)布評(píng)論請(qǐng)先 登錄
京東關(guān)鍵詞搜索 item_search_pro API 接口獲取數(shù)據(jù)
評(píng)論