【问题标题】:R: cannot find discounted price from API responseR:无法从 API 响应中找到折扣价
【发布时间】:2021-11-13 04:33:24
【问题描述】:

我正在尝试获取所有品牌、产品、价格、价格、价格哦!。

  1. 我无法从渲染价格的地方得到哦。

  2. 我希望 API 一次返回所有产品:

所以不是:&_from=0&_to=20,我试过:&_from=0&_to=540,但它不起作用。我得到:HTTP status was '400 Bad Request'

有没有办法一次获取所有信息?

代码:

library(rvest)
library(tidyverse)
library(jsonlite)


x <- httr::GET("https://www.plazavea.com.pe/api/catalog_system/pub/products/search?fq=C:/678/687/&_from=0&_to=20&O=OrderByScoreDESC")



y <- x %>% 
  httr::content(as = "text") %>% 
  jsonlite::parse_json() %>% 
  tibble::tibble() %>% 
  tidyr::unnest_wider(1) %>% 
  #select(productId,productName,items) %>%  # dropping extra stuff for now
  unnest_longer(items) %>% 
  unnest_wider(items) %>% 
  unnest_longer(sellers) %>% 
  unnest_wider(sellers) %>% 
  unnest_wider(commertialOffer)


colnames(y)

w <- y %>%
  select(c(productName, Price, ListPrice, PriceWithoutDiscount))

【问题讨论】:

  • 下面的答案是你想要的吗?

标签: r json


【解决方案1】:

我无法从渲染价格的地方得到哦。

没有 xmlhttp 请求的 JavaScript 渲染,例如 rvest/httr 发出的请求。这需要一个带有 JavaScript 引擎的浏览器。对于像这样的页面,其中有模板并且动态检索值,您需要确定您在页面上看到的值是如何生成的。折扣价格是从给定价格中减去指定折扣金额的结果 - 两者都在 API 响应中提供。只是结构非常嵌套,需要一点逻辑才能弄清楚所做的事情(或读取内容提供者的 JavaScript 文件)。

鉴于解析响应的复杂性,您需要研究返回内容的结构并确定适当的值和到达它们的路径。这是一种通过提供访问器列表来检索值的方法,用于使用purrr:pluck 对对象进行索引。我想说的是,从长期来看,这可能是脆弱的,因为特别是使用了硬编码的数字索引。

library(httr)
library(tidyverse)

get_discount <- function(item) {
  pluck(item, 1, "sellers", 1, "commertialOffer", "Teasers", 1, "<Effects>k__BackingField", 1, 2, "<Value>k__BackingField") %>%
    as.integer() %>%
    .[1] %>%
    replace_na(0)
}

get_price <- function(item) {
  pluck(item, 1, "sellers", 1, "commertialOffer", "Price")
}

x <- httr::GET("https://www.plazavea.com.pe/api/catalog_system/pub/products/search?fq=C:/678/687/&_from=0&_to=20&O=OrderByScoreDESC")

y <- httr::content(x, as = "parsed") %>%
  tibble::tibble() %>%
  tidyr::unnest_wider(1) %>%
  select(productId, productName, brand, linkText, productTitle, items) %>%
  mutate(
    discount = lapply(items, get_discount) %>% unlist(),
    price = lapply(items, get_price) %>% unlist(),
    discounted_price = ifelse(discount == 0, NA_integer_, price - discount)
  ) %>%
  select(-items)

我希望 API 一次返回所有产品

对于请求本身,您可以使用这些参数来尝试优化偏移量和批量大小,但最终允许的范围是服务器端配置的。如果这是一个记录在案的 API,那么这些可能会根据限制进行描述,否则,您将需要反复试验优化/找到一个适当的公共和记录的 API。

【讨论】:

  • 欢迎读者提出改进建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-11
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多