微店作为国内知名的移动电商平台,其搜索接口采用了独特的认证机制和数据返回格式。本文将从接口的认证原理、参数构造、数据解析等方面进行详细分析,并提供完整的 Python 代码实现,帮助开发者快速对接微店搜索接口,实现高效的数据采集和分析。
一、接口认证机制分析
微店搜索接口采用 Token + 签名 的认证方式,核心认证流程如下:
Token 获取:通过微店开放平台获取 app_key 和 app_secret,然后调用令牌获取接口生成 access_token。
签名生成:每次请求时,需要根据请求参数、access_token 和 app_secret 生成签名。
接口调用:在请求头中携带 access_token 和签名,进行接口调用。
关键认证参数
参数 说明 位置
app_key 应用 ID 请求参数
app_secret 应用密钥 签名生成
access_token 访问令牌 请求头 Authorization: Bearer {token}
sign 签名 请求参数
timestamp 时间戳 请求参数
nonce 随机数 请求参数
二、签名生成算法
签名生成是接口认证的核心,具体步骤如下:
将请求参数(不包括 sign)按照字母顺序排序。
将排序后的参数名和参数值拼接成字符串。
在字符串末尾拼接 app_secret。
对拼接后的字符串进行 MD5 加密,得到签名。
python
运行
import hashlib
import time
import random
def generate_sign(params, app_secret):
# 排序参数
sorted_params = sorted(params.items(), key=lambda x: x[0])
# 拼接参数
sign_str = ''.join([f"{k}{v}" for k, v in sorted_params])
# 拼接app_secret
sign_str += app_secret
# MD5加密
sign = hashlib.md5(sign_str.encode()).hexdigest().upper()
return sign
三、接口调用流程
以 关键字搜索接口(v1/goods/search)为例,完整调用流程如下:
1. 获取访问令牌
python
运行
def get_access_token(app_key, app_secret):
url = "https://open.weidian.com/oauth2/token"
params = {
"app_key": app_key,
"app_secret": app_secret,
"grant_type": "client_credentials"
}
response = requests.post(url, params=params)
result = response.json()
return result.get("access_token")
2. 构造请求参数并生成签名
python
运行
def build_request_params(keyword, page, page_size, app_key, access_token, app_secret):
params = {
"app_key": app_key,
"access_token": access_token,
"keyword": keyword,
"page": page,
"page_size": page_size,
"timestamp": int(time.time()),
"nonce": random.randint(100000, 999999)
}
# 生成签名
params["sign"] = generate_sign(params, app_secret)
return params
3. 调用搜索接口
python
运行
def search_goods(keyword, page=1, page_size=20):
app_key = "your_app_key"
app_secret = "your_app_secret"
# 获取access_token
access_token = get_access_token(app_key, app_secret)
# 构造请求参数
params = build_request_params(keyword, page, page_size, app_key, access_token, app_secret)
# 发送请求
url = "https://open.weidian.com/api/v1/goods/search"
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.post(url, data=params, headers=headers)
return response.json()
四、数据解析与处理
接口返回的数据包含商品的基本信息、价格、销量、店铺信息等,需要进行解析和清洗:
python
运行
def parse_search_result(raw_data):
goods_list = []
if raw_data.get("code") == 0 and raw_data.get("data"):
for item in raw_data["data"].get("list", []):
goods_info = {
"goods_id": item.get("goods_id"),
"goods_name": item.get("goods_name"),
"price": item.get("price") / 100, # 分转元
"sales_count": item.get("sales_count"),
"shop_id": item.get("shop_id"),
"shop_name": item.get("shop_name"),
"main_image": item.get("main_image")
}
goods_list.append(goods_info)
return goods_list
五、多维度数据挖掘
通过搜索接口获取商品数据后,可以进行多维度的数据分析,例如:
销量分析:统计不同价格区间、不同类别的商品销量分布。
价格分析:分析商品价格的中位数、平均值、最高价、最低价等。
店铺分析:统计店铺的商品数量、平均销量、平均价格等。
python
运行
import pandas as pd
import matplotlib.pyplot as plt
def analyze_goods_data(goods_list):
# 转换为DataFrame
df = pd.DataFrame(goods_list)
# 销量分析
sales_stats = df["sales_count"].describe()
print("销量统计:")
print(sales_stats)
# 价格分析
price_stats = df["price"].describe()
print("\n价格统计:")
print(price_stats)
# 店铺商品数量统计
shop_goods_count = df["shop_name"].value_counts().head(10)
print("\n店铺商品数量TOP10:")
print(shop_goods_count)
# 可视化销量分布
plt.hist(df["sales_count"], bins=20)
plt.title("商品销量分布")
plt.xlabel("销量")
plt.ylabel("商品数量")
plt.show()
六、完整代码实现
python
运行
import requests
import hashlib
import time
import random
import pandas as pd
import matplotlib.pyplot as plt
def generate_sign(params, app_secret):
sorted_params = sorted(params.items(), key=lambda x: x[0])
sign_str = ''.join([f"{k}{v}" for k, v in sorted_params])
sign_str += app_secret
sign = hashlib.md5(sign_str.encode()).hexdigest().upper()
return sign
def get_access_token(app_key, app_secret):
url = "https://open.weidian.com/oauth2/token"
params = {
"app_key": app_key,
"app_secret": app_secret,
"grant_type": "client_credentials"
}
response = requests.post(url, params=params)
result = response.json()
return result.get("access_token")
def build_request_params(keyword, page, page_size, app_key, access_token, app_secret):
params = {
"app_key": app_key,
"access_token": access_token,
"keyword": keyword,
"page": page,
"page_size": page_size,
"timestamp": int(time.time()),
"nonce": random.randint(100000, 999999)
}
params["sign"] = generate_sign(params, app_secret)
return params
def search_goods(keyword, page=1, page_size=20):
app_key = "your_app_key"
app_secret = "your_app_secret"
access_token = get_access_token(app_key, app_secret)
params = build_request_params(keyword, page, page_size, app_key, access_token, app_secret)
url = "https://open.weidian.com/api/v1/goods/search"
headers = {
"Content-Type": "application/x-www-form-urlencoded"
}
response = requests.post(url, data=params, headers=headers)
return response.json()
def parse_search_result(raw_data):
goods_list = []
if raw_data.get("code") == 0 and raw_data.get("data"):
for item in raw_data["data"].get("list", []):
goods_info = {
"goods_id": item.get("goods_id"),
"goods_name": item.get("goods_name"),
"price": item.get("price") / 100,
"sales_count": item.get("sales_count"),
"shop_id": item.get("shop_id"),
"shop_name": item.get("shop_name"),
"main_image": item.get("main_image")
}
goods_list.append(goods_info)
return goods_list
def analyze_goods_data(goods_list):
df = pd.DataFrame(goods_list)
sales_stats = df["sales_count"].describe()
print("销量统计:")
print(sales_stats)
price_stats = df["price"].describe()
print("\n价格统计:")
print(price_stats)
shop_goods_count = df["shop_name"].value_counts().head(10)
print("\n店铺商品数量TOP10:")
print(shop_goods_count)
plt.hist(df["sales_count"], bins=20)
plt.title("商品销量分布")
plt.xlabel("销量")
plt.ylabel("商品数量")
plt.show()
# 示例:搜索关键词“手机”,获取前2页数据并进行分析
if __name__ == "__main__":
keyword = "手机"
all_goods = []
for page in range(1, 3):
raw_data = search_goods(keyword, page=page, page_size=20)
goods_list = parse_search_result(raw_data)
all_goods.extend(goods_list)
print(f"共获取到 {len(all_goods)} 件商品数据")
if all_goods:
analyze_goods_data(all_goods)
七、注意事项
接口权限:部分接口需要申请特定权限,需在微店开放平台控制台配置。
请求频率:严格遵守微店开放平台的接口调用频率限制,避免超限。
数据格式:接口返回的价格、金额等字段以分为单位,需转换为元。
错误处理:针对不同的错误码(如令牌过期、权限不足)进行针对性处理。
签名验证:每次请求都需要重新生成签名,确保签名的有效性。
通过以上方法,开发者可以快速对接微店搜索接口,实现商品数据的采集和分析,为电商运营和市场调研提供有力支持。在实际应用中,还需根据具体需求进行灵活调整和优化。