如果你在电商价格监控、品类分析或评论挖掘领域做开发,迟早会遇到需要Wildberries数据的客户。这个俄罗斯在线市场体量巨大,但官方从未提供过任何英文API文档。好在它的前端是JavaScript应用,背后直接调用一组公开的JSON接口,无需API密钥,也无需签名或会话令牌。产品、价格、库存、配送、属性、媒体甚至评论,都能用最普通的HTTP请求获取。
接口虽然公开,用法却没表面那么简单。根据我在2026年7月15日首次测量、7月18日重新验证的端点行为,以及截至7月19日的可靠性数据,至少有两个大坑会让毫无戒备的开发者摔得很难看——一个会让你的看板把价格放大100倍,另一个会让爬虫在分页时陷入死循环,永不停止。
先看价格字段。Wildberries每一个响应里的价格数值,都是用戈比表示的整数。你没看错,不是卢布,是戈比。要得到真实价格,必须除以100。
来一段真实返回:
{ "basic": 202400, "product": 23800, "logistics": 0, "return": 0, "cashback": 0}
对于同一副耳机,basic 是2,024卢布,product 是238卢布。basic代表折扣前原价,product才是顾客实际支付的金额。如果你忘了做这个除以100的转换,你的仪表盘就会把所有价格高估整整100倍,而且还会错过折扣信息,直接呈现原价而不是实付价。
第二个坑藏在这个搜索接口的翻页逻辑里:https://search.wb.ru/exactmatch/ru/common/v4/search
它返回 HTTP 200,体感三个顶层字段:metadata、products 和 total。metadata.rs 固定为 100,意味着每页 100 件商品,total 是整个结果集的总条数。用 resultset=catalog 拿到商品列表,用 page 参数翻页,一切看起来平平无奇。
然而Wildberries并不会在最后一页后返回空数据来告诉你“到底了”。当 page 超过实际最大页数时,服务器安静地切回第一页,给你完整的100件商品,HTTP 200,没有任何标记指出这是第一页的重复内容。于是,只要你一直递增 page 直到返回空数组,就永远等不到尽头。爬虫会开始无限循环,一遍又一遍写入重复商品,同时不断冲击那个真正带有频控的搜索端点。
针对俄语查询“ноутбук”,我在7月18日实测:第2、3页返回的是独立结果,第60页却原样搬出了第1页的内容,连首件商品的id都一模一样。不设防的翻页逻辑就这样一头撞进死胡同。
修复这个问题只需要三行代码:记住第一页的第一个商品id,当某一页首件id与此相同时立即停止。类似这样:
let firstIdOfPageOne;for (let page = 1; ; page++) { const { products } = await search(query, page); if (!products?.length) break; if (page === 1) firstIdOfPageOne = products[0].id; else if (products[0].id === firstIdOfPageOne) break; // 已回到第一页}
除了这两个必须避开的陷阱,接口还有不少值得注意的细节。dest 参数对返回商品列表有直接影响,但其具体机制需要单独阐述。价格字段除了 basic 和 product,还包括 logistics、return 和 cashback,都遵循除以100的规则。所有端点都对来自数据中心IP的请求保持开放,未发现身份验证门槛,但搜索端点实测存在频率限制,盲目轮询很快会被压制。
没有官方英文文档并不代表束手无策。只要在搭建数据管道时,记住先把所有价格除以100,再给分页循环上一个“id锚点”,直接调用这批公开JSON端点就能稳定跑通。把这两个坑填平,你手上就多了一套覆盖产品、价格、库存、配送、属性和评论的合规数据源。
热门跟贴