Plazavea商品API技术咨询:折扣价格缺失、未知价格字段来源及批量请求400错误问题
解决Plazavea API数据获取的三个问题
让我们一步步拆解你遇到的问题,同时给出可运行的改进方案:
1. 为什么请求&_from=0&_to=540返回400 Bad Request?
绝大多数电商API都会限制单页返回的最大数据量,Plazavea的这个接口也不例外——它大概率有单页数据条数的上限(比如你之前用的20条)。直接把_to设为540会超出接口允许的范围,所以返回400错误。
解决办法是分页循环请求:先获取总商品数,然后按每页20条(或接口允许的最大条数)循环请求所有页,最后合并数据。
2. 找不到折扣价格?看这些字段映射
从你解析后的字段来看,接口其实已经返回了价格相关的核心数据,对应关系通常是:
ListPrice:商品的原价(price before)Price:当前的折扣价格(也就是实际售卖价)PriceWithoutDiscount:如果有阶梯折扣/会员价,这个字段可能对应无折扣的基准价(和ListPrice可能一致,也可能不同,取决于促销规则)
你可以在代码里明确映射这些字段,比如:
w <- y %>% select( 商品名称 = productName, 原价 = ListPrice, 折扣价 = Price, 无折扣基准价 = PriceWithoutDiscount )
3. 关于price Oh字段的来源
这个字段大概率是前端页面渲染时计算出来的,而不是API直接返回的。常见的情况有两种:
- 它可能是
Price字段的另一种展示格式(比如加上货币符号、千位分隔符) - 或者是结合了其他促销规则的计算值(比如满减后的预估价)
如果是前者,你可以自己用R格式化Price字段得到;如果是后者,你需要检查前端页面的JS逻辑,看它是用哪些API返回的字段计算出来的(比如是否用到了installments字段里的分期信息,或者其他促销字段)。
改进后的完整代码(分页获取所有数据)
library(rvest) library(tidyverse) library(jsonlite) library(httr) # 第一步:获取总商品数,确定分页次数 base_url <- "https://www.plazavea.com.pe/api/catalog_system/pub/products/search?fq=C:/678/687/&O=OrderByScoreDESC" initial_req <- GET(paste0(base_url, "&_from=0&_to=0")) initial_data <- content(initial_req, as = "text") %>% parse_json() total_items <- initial_data$pagination$total # 获取总商品数 # 第二步:分页循环请求所有数据 all_data <- list() page_size <- 20 # 接口允许的单页最大条数,保持20是安全的 for (i in seq(0, total_items - 1, by = page_size)) { from <- i to <- i + page_size - 1 req_url <- paste0(base_url, "&_from=", from, "&_to=", to) response <- GET(req_url) # 检查请求是否成功 if (http_status(response)$category != "Success") { warning(paste("请求分页", from, "-", to, "失败")) next } # 解析数据并添加到列表 parsed_data <- content(response, as = "text") %>% parse_json() %>% tibble() %>% unnest_wider(1) %>% unnest_longer(items) %>% unnest_wider(items) %>% unnest_longer(sellers) %>% unnest_wider(sellers) %>% unnest_wider(commertialOffer) all_data[[length(all_data) + 1]] <- parsed_data } # 合并所有分页数据 final_data <- bind_rows(all_data) # 提取所需字段(包括价格映射) result <- final_data %>% select( 品牌 = brandName, # 补充你需要的品牌字段 商品名称 = productName, 原价 = ListPrice, 折扣价 = Price, 无折扣基准价 = PriceWithoutDiscount ) # 查看结果 head(result)
额外提示
- 如果你不确定
brandName是否是正确的品牌字段,可以运行colnames(final_data)查看所有可用字段,找到对应的品牌字段 - 有些电商API会有请求频率限制,如果你循环请求太快可能被封IP,建议在循环里加
Sys.sleep(1)延迟1秒
内容的提问来源于stack exchange,提问作者Omar Gonzales
相关产品推荐
相关产品推荐

