微店平台关键字搜索接口深度解析:从 Token 动态生成到多维度数据挖掘

微店作为国内知名的移动电商平台,其搜索接口采用了独特的认证机制和数据返回格式。本文将从接口的认证原理、参数构造、数据解析等方面进行详细分析,并提供完整的 Python 代码实现,帮助开发者快速对接微店搜索接口,实现高效的数据采集和分析。

一、接口认证机制分析

微店搜索接口采用 Token + 签名 的认证方式,核心认证流程如下:

  1. Token 获取 :通过微店开放平台获取 app_keyapp_secret,然后调用令牌获取接口生成 access_token
  2. 签名生成 :每次请求时,需要根据请求参数、access_tokenapp_secret 生成签名。
  3. 接口调用 :在请求头中携带 access_token 和签名,进行接口调用。

关键认证参数

参数 说明 位置
app_key 应用 ID 请求参数
app_secret 应用密钥 签名生成
access_token 访问令牌 请求头 Authorization: Bearer {token}
sign 签名 请求参数
timestamp 时间戳 请求参数
nonce 随机数 请求参数

二、签名生成算法

签名生成是接口认证的核心,具体步骤如下:

  1. 将请求参数(不包括 sign)按照字母顺序排序。
  2. 将排序后的参数名和参数值拼接成字符串。
  3. 在字符串末尾拼接 app_secret
  4. 对拼接后的字符串进行 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

点击获取key和secret

三、接口调用流程

关键字搜索接口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

五、多维度数据挖掘

通过搜索接口获取商品数据后,可以进行多维度的数据分析,例如:

  1. 销量分析:统计不同价格区间、不同类别的商品销量分布。
  2. 价格分析:分析商品价格的中位数、平均值、最高价、最低价等。
  3. 店铺分析:统计店铺的商品数量、平均销量、平均价格等。

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)

七、注意事项

  1. 接口权限:部分接口需要申请特定权限,需在微店开放平台控制台配置。
  2. 请求频率:严格遵守微店开放平台的接口调用频率限制,避免超限。
  3. 数据格式:接口返回的价格、金额等字段以分为单位,需转换为元。
  4. 错误处理:针对不同的错误码(如令牌过期、权限不足)进行针对性处理。
  5. 签名验证:每次请求都需要重新生成签名,确保签名的有效性。

通过以上方法,开发者可以快速对接微店搜索接口,实现商品数据的采集和分析,为电商运营和市场调研提供有力支持。在实际应用中,还需根据具体需求进行灵活调整和优化。

相关推荐
PineappleCoder3 分钟前
性能数据别再瞎轮询了!PerformanceObserver 异步捕获 LCP/CLS,不卡主线程
前端·性能优化
PineappleCoder4 分钟前
告别字体闪烁 / 首屏卡顿!preload 让关键资源 “高优先级” 提前到
前端·性能优化
45288655上山打老虎18 分钟前
C++完美转发
java·jvm·c++
Seven9720 分钟前
查找算法
java
m0_4711996328 分钟前
【vue】通俗详解package-lock文件的作用
前端·javascript·vue.js
GIS之路1 小时前
GDAL 读取KML数据
前端
今天不要写bug1 小时前
vue项目基于vue-cropper实现图片裁剪与图片压缩
前端·javascript·vue.js·typescript
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 公务员考试在线测试系统为例,包含答辩的问题和答案
java
serendipity_hky1 小时前
【SpringCloud | 第2篇】OpenFeign远程调用
java·后端·spring·spring cloud·openfeign