微店平台关键字搜索接口深度解析:从 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. 签名验证:每次请求都需要重新生成签名,确保签名的有效性。

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

相关推荐
侠客行03176 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪6 小时前
深入浅出LangChain4J
java·langchain·llm
子兮曰6 小时前
OpenClaw入门:从零开始搭建你的私有化AI助手
前端·架构·github
吴仰晖6 小时前
使用github copliot chat的源码学习之Chromium Compositor
前端
1024小神6 小时前
github发布pages的几种状态记录
前端
老毛肚8 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎8 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
不像程序员的程序媛8 小时前
Nginx日志切分
服务器·前端·nginx
Yvonne爱编码8 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚8 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言