×

京东工业关键词检索商品列表实践:适配 B 端采购数据清洗方案

Ace Ace 发表于2026-10-30 16:44:57 浏览3 评论0

抢沙发发表评论

前言

京东工业面向企业采购场景,和普通零售站点检索逻辑差异很大,返回数据会包含含税价、MOQ 起订量、履约仓、企业专享价等 B 端独有字段,直接套用零售站检索方案很容易拿到无效数据。本文不做简单的请求封装,重点聚焦B 端业务字段归一化、广告商品过滤、分页终止判断三个业务痛点,提供可直接落地的调用示例,适配物资寻源、比价系统的开发需求。

前置准备

接入前需要在京东工业开放平台完成企业入驻,获取应用凭证与访问令牌;检索请求携带令牌,关键词需要做 url 编码,同时支持类目筛选、排序规则切换。B 端检索有严格的频次管控,必须内置退避重试,避免权限受限。

点击获取key和secret

代码实现

import requests
import time
import urllib.parse

class JdIndustrySearch:
    def __init__(self, token):
        self.token = token
        self.base_url = "https://iop.jd.com/industry/goods/search"
        self.session = requests.Session()
        self.session.headers.update({
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
        })

    def search_goods(self, keyword, page=1, page_size=20, cat_id=None):
        params = {
            "token": self.token,
            "keyword": urllib.parse.quote(keyword),
            "pageIndex": page,
            "pageSize": page_size
        }
        if cat_id:
            params["catId"] = cat_id
        try:
            resp = self.session.get(self.base_url, params=params, timeout=10)
            res_json = resp.json()
            if res_json.get("code") != 0:
                print(f"请求异常:{res_json.get('msg')}")
                return []
            raw_list = res_json.get("data", {}).get("goodsList", [])
            clean_list = []
            for item in raw_list:
                # 过滤广告推广商品
                if item.get("isAd") == 1:
                    continue
                clean_item = {
                    "skuId": item.get("skuId"),
                    "goodsName": item.get("goodsName"),
                    "taxPrice": item.get("taxPrice"),
                    "moq": item.get("moq"),
                    "stockNum": item.get("stockNum"),
                    "storeName": item.get("storeName")
                }
                clean_list.append(clean_item)
            return clean_list
        except Exception as e:
            print(f"网络异常:{str(e)}")
            return []

    def multi_page_search(self, keyword, max_page=3):
        all_data = []
        for p in range(1, max_page + 1):
            page_data = self.search_goods(keyword, page=p)
            if not page_data:
                break
            all_data.extend(page_data)
            time.sleep(0.8)
        return all_data

if __name__ == "__main__":
    searcher = JdIndustrySearch(token="你的access_token")
    result = searcher.multi_page_search("劳保手套", max_page=2)
    for row in result:
        print(row)

核心逻辑说明

  1. 广告过滤:B 端检索结果会混入推广商品,通过isAd标记剔除,保证比价数据真实;

  2. 字段裁剪:只保留采购业务核心字段,剔除冗余前端展示字段,减少存储压力;

  3. 分页终止:当单页返回空列表时自动停止,防止无限循环请求;

  4. 限流保护:每页请求增加休眠间隔,符合平台调用规范。

踩坑总结

第一,关键词编码不能省略,含特殊符号、中文的检索词不编码会返回空结果;第二,起订量 MOQ 是工业采购重点,部分商品 MOQ 大于 1,业务侧不能直接按单价计算成本;第三,令牌存在有效期,建议业务层做缓存并定时刷新;第四,类目筛选仅支持三级类目 ID,一级、二级类目传入会过滤失败。

总结

这套方案更贴合工业采购的业务场景,区别于普通零售检索脚本,重点解决 B 端数据降噪问题。可在此基础上扩展排序、类目筛选、批量入库等功能,用于企业物资比价、供应商寻源等业务系统。


群贤毕至

访客