错开麋鹿苹果版(Miss the Moose)
141.7M · 2025-09-12
1688 平台的 item_search_best
接口是获取各类榜单数据的核心接口,能够返回平台上不同类目、不同维度的热销商品榜单信息。对于商家选品、市场趋势分析、竞品监控等场景具有重要价值,尤其是在 B2B 电商环境中,能帮助企业把握市场动态和采购趋势。
一、接口核心特性分析
核心功能:获取 1688 平台各类榜单数据,包括热销榜、飙升榜、新品榜等
数据特点:
应用场景:
1688 开放平台的 item_search_best
接口采用标准认证方式:
appkey + appsecret
的身份验证access_token
进行授权访问请求参数
参数名 | 类型 | 是否必填 | 说明 |
---|---|---|---|
cat | String | 否 | 类目 ID,为空时返回全类目榜单 |
rank_type | String | 是 | 榜单类型:best(热销榜)、rise(飙升榜)、new(新品榜) |
period | String | 否 | 时间周期:day(日榜)、week(周榜)、month(月榜),默认 day |
page | Integer | 否 | 页码,默认 1 |
page_size | Integer | 否 | 每页条数,默认 20,最大 50 |
industry | String | 否 | 行业 ID,用于筛选特定行业榜单 |
appkey | String | 是 | 应用密钥 |
access_token | String | 是 | 访问令牌 |
timestamp | Integer | 是 | 时间戳 |
响应核心字段
榜单元信息:榜单类型、时间周期、类目、更新时间
分页信息:总商品数、总页数、当前页码
商品列表:每个商品包含
二、Python 脚本实现
以下是调用 1688 item_search_best
接口的完整 Python 实现,包含认证、请求、数据解析和深度分析功能:
import requests
import time
import json
import logging
import re
import os
from typing import Dict, Optional, List, Tuple
from requests.exceptions import RequestException
import matplotlib.pyplot as plt
import numpy as np
from collections import defaultdict
logging.basicConfig( level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" )
class Alibaba1688BestSearchAPI: def init(self, appkey: str, appsecret: str): """ 初始化1688榜单接口客户端 :param appkey: 1688开放平台appkey :param appsecret: 1688开放平台appsecret """ self.appkey = appkey self.appsecret = appsecret self.base_url = "gw.open.1688.com/openapi/gat…" self.session = requests.Session() self.access_token = None self.token_expires_at = 0 # token过期时间戳 self.session.headers.update({ "Content-Type": "application/x-www-form-urlencoded", "User-Agent": "AlibabaApp/10.1.0 (Android; 11; Scale/2.00)" })
def _get_access_token(self) -> Optional[str]:
"""获取访问令牌"""
# 检查token是否有效
if self.access_token and self.token_expires_at > time.time() + 60:
return self.access_token
logging.info("获取新的access_token")
params = {
"method": "alibaba.oauth2.getToken",
"client_id": self.appkey,
"client_secret": self.appsecret,
"grant_type": "client_credentials",
"format": "json"
}
try:
response = self.session.get(self.base_url, params=params, timeout=10)
response.raise_for_status()
result = response.json()
if "error_response" in result:
logging.error(f"获取access_token失败: {result['error_response']['msg']} (错误码: {result['error_response']['code']})")
return None
self.access_token = result["access_token"]
self.token_expires_at = time.time() + result.get("expires_in", 86400) # 默认为24小时
return self.access_token
except RequestException as e:
logging.error(f"获取access_token请求异常: {str(e)}")
return None
def search_best_items(self,
rank_type: str = "best",
cat: Optional[str] = None,
period: str = "day",
page: int = 1,
page_size: int = 20,
industry: Optional[str] = None) -> Optional[Dict]:
"""
获取榜单商品数据
:param rank_type: 榜单类型:best(热销榜)、rise(飙升榜)、new(新品榜)
:param cat: 类目ID
:param period: 时间周期:day(日榜)、week(周榜)、month(月榜)
:param page: 页码
:param page_size: 每页条数
:param industry: 行业ID
:return: 榜单数据
"""
# 验证参数
valid_rank_types = ["best", "rise", "new"]
if rank_type not in valid_rank_types:
logging.error(f"无效的榜单类型: {rank_type},支持: {valid_rank_types}")
return None
valid_periods = ["day", "week", "month"]
if period not in valid_periods:
logging.error(f"无效的时间周期: {period},支持: {valid_periods}")
return None
if page_size < 1 or page_size > 50:
logging.error(f"每页条数必须在1-50之间,当前为: {page_size}")
return None
# 获取有效的access_token
if not self._get_access_token():
return None
# 构建参数
timestamp = int(time.time())
params = {
"method": "alibaba.item.search.best",
"client_id": self.appkey,
"access_token": self.access_token,
"timestamp": timestamp,
"format": "json",
"v": "1.0",
"rank_type": rank_type,
"period": period,
"page": page,
"page_size": page_size
}
# 添加可选参数
if cat:
params["cat"] = cat
if industry:
params["industry"] = industry
try:
response = self.session.get(self.base_url, params=params, timeout=15)
response.raise_for_status()
result = response.json()
if "error_response" in result:
logging.error(f"获取榜单数据失败: {result['error_response']['msg']} (错误码: {result['error_response']['code']})")
return None
best_response = result.get("alibaba_item_search_best_response", {})
best_data = best_response.get("result", {})
if not best_data:
logging.warning("未获取到榜单数据")
return None
# 格式化榜单数据
return self._format_best_data(best_data, rank_type, period, cat, industry)
except RequestException as e:
logging.error(f"获取榜单数据请求异常: {str(e)}")
return None
except json.JSONDecodeError:
logging.error(f"榜单数据响应解析失败: {response.text[:200]}...")
return None
def _format_best_data(self, best_data: Dict, rank_type: str, period: str, cat: Optional[str], industry: Optional[str]) -> Dict:
"""格式化榜单数据"""
# 榜单元信息
rank_info = {
"rank_type": rank_type,
"rank_type_name": self._get_rank_type_name(rank_type),
"period": period,
"period_name": self._get_period_name(period),
"category_id": cat,
"category_name": best_data.get("category_name", ""),
"industry_id": industry,
"industry_name": best_data.get("industry_name", ""),
"update_time": best_data.get("update_time", time.strftime("%Y-%m-%d %H:%M:%S"))
}
# 分页信息
pagination = {
"total_items": int(best_data.get("total_results", 0)),
"total_pages": (int(best_data.get("total_results", 0)) + int(best_data.get("page_size", 20)) - 1) // int(best_data.get("page_size", 20)),
"current_page": int(best_data.get("page", 1)),
"page_size": int(best_data.get("page_size", 20))
}
# 格式化商品列表
items = []
for item in best_data.get("items", []):
# 处理排名变化
rank_change = item.get("rank_change", 0)
rank_change_type = "up" if rank_change > 0 else "down" if rank_change < 0 else "same"
# 处理价格信息
price_info = self._parse_price_info(item)
# 处理供应商信息
supplier_info = {
"supplier_id": item.get("supplier_id"),
"supplier_name": item.get("supplier_name"),
"credit_level": item.get("credit_level"),
"years": int(item.get("operating_years", 0)),
"is_gold_supplier": item.get("is_gold_supplier", False)
}
items.append({
"rank": int(item.get("rank", 0)),
"rank_change": rank_change,
"rank_change_type": rank_change_type,
"item_id": item.get("offer_id"),
"title": item.get("title"),
"image_url": item.get("image_url"),
"detail_url": item.get("detail_url"),
"price_info": price_info,
"sales_info": {
"sales_30d": int(item.get("sales_count_30d", 0)),
"turnover_30d": float(item.get("turnover_30d", 0)),
"growth_rate": float(item.get("growth_rate", 0)) if item.get("growth_rate") else 0
},
"supplier_info": supplier_info,
"category": {
"cid": item.get("category_id"),
"name": item.get("category_name")
},
"tags": item.get("tags", "").split(",") if item.get("tags") else [],
"hot_score": int(item.get("hot_score", 0)),
"reason": item.get("reason", "") # 上榜理由
})
return {
"rank_info": rank_info,
"pagination": pagination,
"items": items,
"raw_data": best_data # 保留原始数据
}
def _get_rank_type_name(self, rank_type: str) -> str:
"""转换榜单类型为中文名称"""
rank_type_map = {
"best": "热销榜",
"rise": "飙升榜",
"new": "新品榜"
}
return rank_type_map.get(rank_type, rank_type)
def _get_period_name(self, period: str) -> str:
"""转换时间周期为中文名称"""
period_map = {
"day": "日榜",
"week": "周榜",
"month": "月榜"
}
return period_map.get(period, period)
def _parse_price_info(self, item: Dict) -> Dict:
"""解析价格信息"""
# 处理批发价格区间
wholesale_prices = []
if item.get("wholesale_price_list"):
for price in item["wholesale_price_list"]:
wholesale_prices.append({
"min_quantity": int(price.get("min_quantity", 0)),
"price": float(price.get("price", 0))
})
return {
"min_price": float(item.get("min_price", 0)),
"max_price": float(item.get("max_price", 0)),
"price_unit": item.get("price_unit", "个"),
"wholesale_prices": wholesale_prices,
"mix_batch": item.get("support_mix_batch", False)
}
def get_full_rank_list(self, rank_type: str = "best", max_pages: int = 5, **kwargs) -> Dict:
"""
获取完整的榜单数据
:param rank_type: 榜单类型
:param max_pages: 最大页数限制
:return: 完整的榜单数据
"""
all_items = []
page = 1
rank_info = None
while page <= max_pages:
logging.info(f"获取榜单第 {page} 页数据")
result = self.search_best_items(
rank_type=rank_type,
page=page,** kwargs
)
if not result or not result["items"]:
break
# 保存榜单元信息
if not rank_info:
rank_info = result["rank_info"]
all_items.extend(result["items"])
# 检查是否已到最后一页
if page >= result["pagination"]["total_pages"]:
break
page += 1
# 控制请求频率
time.sleep(2)
logging.info(f"共获取到 {len(all_items)} 条榜单数据")
return {
"rank_info": rank_info,
"total_items": len(all_items),
"items": all_items
}
def analyze_rank_data(self, rank_data: Dict) -> Dict:
"""分析榜单数据"""
if not rank_data or not rank_data["items"]:
return {}
items = rank_data["items"]
total = len(items)
# 价格分析
price_analysis = self._analyze_prices(items)
# 类目分布分析
category_analysis = self._analyze_categories(items)
# 供应商分析
supplier_analysis = self._analyze_suppliers(items)
# 销售增长分析(针对飙升榜)
growth_analysis = {}
if rank_data["rank_info"]["rank_type"] == "rise":
growth_analysis = self._analyze_growth(items)
# 排名变化分析
rank_change_analysis = self._analyze_rank_changes(items)
# 提取表现突出的商品
top_performers = self._get_top_performers(items, rank_data["rank_info"]["rank_type"])
return {
"summary": {
"rank_type": rank_data["rank_info"]["rank_type_name"],
"period": rank_data["rank_info"]["period_name"],
"category": rank_data["rank_info"]["category_name"] or "全类目",
"total_items": total,
"update_time": rank_data["rank_info"]["update_time"]
},
"price_analysis": price_analysis,
"category_analysis": category_analysis,
"supplier_analysis": supplier_analysis,
"growth_analysis": growth_analysis,
"rank_change_analysis": rank_change_analysis,
"top_performers": top_performers
}
def _analyze_prices(self, items: List[Dict]) -> Dict:
"""分析价格分布"""
prices = [item["price_info"]["min_price"] for item in items if item["price_info"]["min_price"] > 0]
if not prices:
return {}
min_price = min(prices)
max_price = max(prices)
avg_price = round(sum(prices) / len(prices), 2)
# 价格区间分布
price_ranges = self._get_price_ranges(min_price, max_price)
range_counts = defaultdict(int)
for price in prices:
for r in price_ranges:
if r[0] <= price < r[1]:
range_counts[f"{r[0]}-{r[1]}"] += 1
break
else:
range_counts[f"{price_ranges[-1][1]}+"] += 1
# 起订量分析
min_order_quantities = []
for item in items:
if item["price_info"]["wholesale_prices"]:
min_order_quantities.append(item["price_info"]["wholesale_prices"][0]["min_quantity"])
order_analysis = {}
if min_order_quantities:
order_analysis = {
"min": min(min_order_quantities),
"max": max(min_order_quantities),
"avg": round(sum(min_order_quantities) / len(min_order_quantities), 1),
"distribution": self._analyze_order_quantities(min_order_quantities)
}
return {
"min_price": min_price,
"max_price": max_price,
"avg_price": avg_price,
"median_price": self._calculate_median(prices),
"range_distribution": dict(range_counts),
"order_quantity": order_analysis,
"mix_batch_ratio": round(sum(1 for item in items if item["price_info"]["mix_batch"]) / len(items) * 100, 1)
}
def _analyze_categories(self, items: List[Dict]) -> Dict:
"""分析类目分布"""
category_counts = defaultdict(int)
category_sales = defaultdict(int)
for item in items:
cat_name = item["category"]["name"] or "未分类"
category_counts[cat_name] += 1
category_sales[cat_name] += item["sales_info"]["sales_30d"]
# 按商品数量排序
sorted_categories = sorted(category_counts.items(), key=lambda x: x[1], reverse=True)
return {
"total_categories": len(category_counts),
"distribution": dict(category_counts),
"sales_by_category": dict(category_sales),
"top_categories": sorted_categories[:5]
}
def _analyze_suppliers(self, items: List[Dict]) -> Dict:
"""分析供应商特征"""
supplier_counts = defaultdict(int)
gold_supplier_count = 0
years_operating = []
for item in items:
supplier_id = item["supplier_info"]["supplier_id"]
supplier_counts[supplier_id] += 1
if item["supplier_info"]["is_gold_supplier"]:
gold_supplier_count += 1
if item["supplier_info"]["years"] > 0:
years_operating.append(item["supplier_info"]["years"])
# 计算平均经营年限
avg_years = round(sum(years_operating) / len(years_operating), 1) if years_operating else 0
# 多上榜商品的供应商
multi_item_suppliers = [(k, v) for k, v in supplier_counts.items() if v > 1]
multi_item_suppliers.sort(key=lambda x: x[1], reverse=True)
# 提取供应商名称
supplier_names = {item["supplier_info"]["supplier_id"]: item["supplier_info"]["supplier_name"] for item in items}
top_suppliers = []
for sid, count in multi_item_suppliers[:5]:
top_suppliers.append((supplier_names.get(sid, "未知供应商"), count))
return {
"total_suppliers": len(supplier_counts),
"gold_supplier_ratio": round(gold_supplier_count / len(items) * 100, 1),
"avg_operating_years": avg_years,
"multi_item_suppliers_count": len(multi_item_suppliers),
"top_suppliers": top_suppliers
}
def _analyze_growth(self, items: List[Dict]) -> Dict:
"""分析销售增长情况(针对飙升榜)"""
growth_rates = [item["sales_info"]["growth_rate"] for item in items if item["sales_info"]["growth_rate"] is not None]
if not growth_rates:
return {}
avg_growth = round(sum(growth_rates) / len(growth_rates), 2)
max_growth = max(growth_rates)
min_growth = min(growth_rates)
# 增长率分布
growth_ranges = [(-float('inf'), 50), (50, 100), (100, 200), (200, 500), (500, float('inf'))]
growth_distribution = defaultdict(int)
for rate in growth_rates:
for r in growth_ranges:
if r[0] < rate <= r[1]:
growth_distribution[f"{r[0] if r[0] != -float('inf') else ''}-{r[1] if r[1] != float('inf') else '+'}%"] += 1
break
# 增长率与价格相关性
price_growth_correlation = self._calculate_correlation(
[item["price_info"]["min_price"] for item in items],
[item["sales_info"]["growth_rate"] for item in items]
)
return {
"avg_growth_rate": avg_growth,
"max_growth_rate": max_growth,
"min_growth_rate": min_growth,
"distribution": dict(growth_distribution),
"price_correlation": round(price_growth_correlation, 4)
}
def _analyze_rank_changes(self, items: List[Dict]) -> Dict:
"""分析排名变化"""
up_count = sum(1 for item in items if item["rank_change_type"] == "up")
down_count = sum(1 for item in items if item["rank_change_type"] == "down")
same_count = sum(1 for item in items if item["rank_change_type"] == "same")
# 排名变化幅度分析
up_changes = [abs(item["rank_change"]) for item in items if item["rank_change_type"] == "up"]
down_changes = [abs(item["rank_change"]) for item in items if item["rank_change_type"] == "down"]
return {
"up_ratio": round(up_count / len(items) * 100, 1),
"down_ratio": round(down_count / len(items) * 100, 1),
"same_ratio": round(same_count / len(items) * 100, 1),
"avg_up_change": round(sum(up_changes) / len(up_changes), 1) if up_changes else 0,
"avg_down_change": round(sum(down_changes) / len(down_changes), 1) if down_changes else 0
}
def _get_top_performers(self, items: List[Dict], rank_type: str) -> List[Dict]:
"""获取表现突出的商品"""
if rank_type == "best":
# 热销榜按销量排序
return sorted(items, key=lambda x: x["sales_info"]["sales_30d"], reverse=True)[:10]
elif rank_type == "rise":
# 飙升榜按增长率排序
return sorted(items, key=lambda x: x["sales_info"]["growth_rate"], reverse=True)[:10]
else: # new
# 新品榜按热度排序
return sorted(items, key=lambda x: x["hot_score"], reverse=True)[:10]
# 工具方法
def _get_price_ranges(self, min_price: float, max_price: float) -> List[Tuple[float, float]]:
"""生成合理的价格区间"""
if min_price >= max_price:
return [(min_price - 1, max_price + 1)]
# 计算区间数量,最多8个区间
range_count = min(8, int(max_price - min_price) // 10 + 1)
step = (max_price - min_price) / range_count
ranges = []
for i in range(range_count):
start = min_price + i * step
end = min_price + (i + 1) * step
ranges.append((round(start, 1), round(end, 1)))
return ranges
def _calculate_median(self, data: List[float]) -> float:
"""计算中位数"""
sorted_data = sorted(data)
n = len(sorted_data)
if n % 2 == 1:
return round(sorted_data[n//2], 2)
else:
return round((sorted_data[n//2 - 1] + sorted_data[n//2]) / 2, 2)
def _analyze_order_quantities(self, quantities: List[int]) -> Dict:
"""分析起订量分布"""
ranges = [(1, 5), (6, 20), (21, 100), (101, 500), (501, float('inf'))]
distribution = defaultdict(int)
for qty in quantities:
for r in ranges:
if r[0] <= qty <= r[1]:
distribution[f"{r[0]}-{r[1] if r[1] != float('inf') else '+'}"] += 1
break
return dict(distribution)
def _calculate_correlation(self, x: List[float], y: List[float]) -> float:
"""计算皮尔逊相关系数"""
if len(x) != len(y) or len(x) < 2:
return 0.0
n = len(x)
sum_x = sum(x)
sum_y = sum(y)
sum_xy = sum(xi * yi for xi, yi in zip(x, y))
sum_x2 = sum(xi **2 for xi in x)
sum_y2 = sum(yi** 2 for yi in y)
numerator = n * sum_xy - sum_x * sum_y
denominator = ((n * sum_x2 - sum_x **2) * (n * sum_y2 - sum_y** 2)) **0.5
return numerator / denominator if denominator != 0 else 0.0
def visualize_analysis(self, analysis: Dict, output_dir: str = "rank_analysis") -> None:
"""可视化分析结果"""
# 创建输出目录
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 设置中文显示
plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
plt.rcParams["axes.unicode_minus"] = False
# 1. 价格分布直方图
plt.figure(figsize=(10, 6))
if analysis["price_analysis"]["range_distribution"]:
ranges = list(analysis["price_analysis"]["range_distribution"].keys())
counts = list(analysis["price_analysis"]["range_distribution"].values())
plt.bar(ranges, counts, color='skyblue')
plt.title(f"商品价格区间分布 (平均价格: {analysis['price_analysis']['avg_price']}元)")
plt.xlabel("价格区间 (元)")
plt.ylabel("商品数量")
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig(f"{output_dir}/price_distribution.png")
plt.close()
# 2. 类目分布饼图
plt.figure(figsize=(10, 6))
top_cats = analysis["category_analysis"]["top_categories"]
if top_cats:
labels = [cat[0] for cat in top_cats]
sizes = [cat[1] for cat in top_cats]
# 其他分类合并
if len(analysis["category_analysis"]["distribution"]) > 5:
other_count = sum(analysis["category_analysis"]["distribution"].values()) - sum(sizes)
labels.append("其他")
sizes.append(other_count)
plt.pie(sizes, labels=labels, autopct='%1.1f%%', startangle=90)
plt.title("商品类目分布")
plt.axis('equal')
plt.tight_layout()
plt.savefig(f"{output_dir}/category_distribution.png")
plt.close()
# 3. 排名变化分析饼图
plt.figure(figsize=(8, 8))
change_labels = ['排名上升', '排名下降', '排名不变']
change_sizes = [
analysis["rank_change_analysis"]["up_ratio"],
analysis["rank_change_analysis"]["down_ratio"],
analysis["rank_change_analysis"]["same_ratio"]
]
plt.pie(change_sizes, labels=change_labels, autopct='%1.1f%%',
startangle=90, colors=['#4CAF50', '#F44336', '#9E9E9E'])
plt.title("排名变化分布")
plt.axis('equal')
plt.tight_layout()
plt.savefig(f"{output_dir}/rank_change_distribution.png")
plt.close()
# 4. 供应商类型分布
plt.figure(figsize=(8, 6))
supplier_labels = ['金牌供应商', '普通供应商']
supplier_sizes = [
analysis["supplier_analysis"]["gold_supplier_ratio"],
100 - analysis["supplier_analysis"]["gold_supplier_ratio"]
]
plt.bar(supplier_labels, supplier_sizes, color=['#FFC107', '#E0E0E0'])
plt.title("供应商类型占比")
plt.ylabel('占比 (%)')
plt.ylim(0, 100)
for i, v in enumerate(supplier_sizes):
plt.text(i, v + 1, f'{v}%', ha='center')
plt.tight_layout()
plt.savefig(f"{output_dir}/supplier_type_ratio.png")
plt.close()
# 5. 增长率分布(仅针对飙升榜)
if analysis["growth_analysis"]:
plt.figure(figsize=(10, 6))
growth_ranges = list(analysis["growth_analysis"]["distribution"].keys())
growth_counts = list(analysis["growth_analysis"]["distribution"].values())
plt.bar(growth_ranges, growth_counts, color='#FF5722')
plt.title(f"销售增长率分布 (平均增长率: {analysis['growth_analysis']['avg_growth_rate']}%)")
plt.xlabel("增长率区间")
plt.ylabel("商品数量")
plt.xticks(rotation=45)
plt.tight_layout()
plt.savefig(f"{output_dir}/growth_rate_distribution.png")
plt.close()
logging.info(f"分析图表已保存至 {output_dir} 目录")
if name == "main": # 替换为实际的appkey和appsecret(从1688开放平台获取) APPKEY = "your_appkey" APPSECRET = "your_appsecret" # 可选:指定类目ID,为空则返回全类目 CATEGORY_ID = "" # 榜单类型:best(热销榜)、rise(飙升榜)、new(新品榜) RANK_TYPE = "best" # 时间周期:day(日榜)、week(周榜)、month(月榜) PERIOD = "week"
# 初始化API客户端
api = Alibaba1688BestSearchAPI(APPKEY, APPSECRET)
# 获取完整榜单数据
rank_data = api.get_full_rank_list(
rank_type=RANK_TYPE,
cat=CATEGORY_ID,
period=PERIOD,
max_pages=3 # 最多获取3页
)
if rank_data and rank_data["items"]:
# 分析榜单数据
analysis = api.analyze_rank_data(rank_data)
print(f"=== 1688{analysis['summary']['rank_type']}分析报告 ===")
print(f"榜单类型: {analysis['summary']['rank_type']} ({analysis['summary']['period']})")
print(f"类目: {analysis['summary']['category']}")
print(f"更新时间: {analysis['summary']['update_time']}")
print(f"总商品数: {analysis['summary']['total_items']}件")
# 价格分析
print("n价格分析:")
print(f" 价格范围: {analysis['price_analysis']['min_price']}-{analysis['price_analysis']['max_price']}元")
print(f" 平均价格: {analysis['price_analysis']['avg_price']}元")
print(f" 支持混批商品占比: {analysis['price_analysis']['mix_batch_ratio']}%")
print(f" 平均起订量: {analysis['price_analysis']['order_quantity']['avg']}件" if analysis['price_analysis']['order_quantity'] else "")
# 类目分析
print("n类目分析:")
print(f" 总类目数: {analysis['category_analysis']['total_categories']}个")
print(" 上榜商品最多的5个类目:")
for i, (cat, count) in enumerate(analysis['category_analysis']['top_categories'][:5], 1):
print(f" {i}. {cat}: {count}件")
# 供应商分析
print("n供应商分析:")
print(f" 总供应商数: {analysis['supplier_analysis']['total_suppliers']}家")
print(f" 金牌供应商占比: {analysis['supplier_analysis']['gold_supplier_ratio']}%")
print(f" 平均经营年限: {analysis['supplier_analysis']['avg_operating_years']}年")
if analysis['supplier_analysis']['top_suppliers']:
print(" 上榜商品最多的供应商:")
for i, (supplier, count) in enumerate(analysis['supplier_analysis']['top_suppliers'][:3], 1):
print(f" {i}. {supplier}: {count}件商品上榜")
# 排名变化分析
print("n排名变化分析:")
print(f" 排名上升: {analysis['rank_change_analysis']['up_ratio']}%")
print(f" 排名下降: {analysis['rank_change_analysis']['down_ratio']}%")
print(f" 排名不变: {analysis['rank_change_analysis']['same_ratio']}%")
# 飙升榜特有分析
if analysis["growth_analysis"]:
print("n增长分析:")
print(f" 平均增长率: {analysis['growth_analysis']['avg_growth_rate']}%")
print(f" 最高增长率: {analysis['growth_analysis']['max_growth_rate']}%")
# 表现突出商品
print("n表现突出的商品TOP3:")
for i, item in enumerate(analysis['top_performers'][:3], 1):
print(f" {i}. {item['title'][:30]}...")
print(f" 排名: {item['rank']} ({'上升' if item['rank_change_type'] == 'up' else '下降' if item['rank_change_type'] == 'down' else '不变'}{abs(item['rank_change']) if item['rank_change'] !=0 else ''})")
print(f" 价格: {item['price_info']['min_price']}-{item['price_info']['max_price']}元")
print(f" 30天销量: {item['sales_info']['sales_30d']}件")
print(f" 供应商: {item['supplier_info']['supplier_name']}")
# 生成可视化图表
api.visualize_analysis(analysis)
三、接口调用注意事项
错误码 | 说明 | 解决方案 |
---|---|---|
401 | 认证失败 | 检查 appkey、appsecret 和 access_token 的有效性 |
403 | 权限不足 | 申请榜单接口访问权限,必要时升级企业账号 |
404 | 类目或行业不存在 | 确认 cat 和 industry 参数是否正确 |
429 | 调用频率超限 | 降低调用频率,实现请求限流 |
500 | 服务器错误 | 实现重试机制,最多 3 次,采用指数退避策略 |
110 | 参数错误 | 检查 rank_type 和 period 参数是否在有效范围内 |
20001 | 数据未更新 | 稍后再试,避开系统更新时段 |
四、应用场景与扩展建议
典型应用场景
扩展建议
通过合理使用 1688 item_search_best
接口,开发者可以构建功能丰富的市场分析系统,深入了解 B2B 电商平台的商品趋势和市场动态,为商业决策提供数据支持。在实际应用中,需结合业务场景合理选择榜单类型和时间周期,并关注数据的时效性和变化趋势。
141.7M · 2025-09-12
191.5M · 2025-09-12
1.2G · 2025-09-12