【问题标题】:Scraping with Rvest, POST request使用 Rvest 抓取,POST 请求
【发布时间】:2021-01-12 20:12:50
【问题描述】:

我对 Rvest 中的请求有疑问。

我从浏览器访问此链接,并且元素在滚动时出现:

https://www.disco.com.ar/Comprar/Home.aspx#_atCategory=false&_atGrilla=true&_id=446223

查看详细信息,我找到了这个请求:

enter image description here

(link2 = "https://www.disco.com.ar/Comprar/HomeService.aspx/ObtenerArticulosPorDescripcionMarcaFamiliaLevex")

以前不要使用“POST”作为请求。我尝试了这些代码,但没有成功。

library(rvest)
library(httr)
library(jsonlite)


url_2<-"https://www.disco.com.ar/Comprar/HomeService.aspx/ObtenerArticulosPorDescripcionMarcaFamiliaLevex"

cuerpo <- list(
  
  IdMenu="446223",textoBusqueda="", producto="", marca="", pager="", ordenamiento=0, precioDesde="", precioHasta=""
)

page <- httr::POST(url_2,body=cuerpo,encode="form")

pagina <- content(page) %>% 
  html_attr("value")
r <- POST("https://www.disco.com.ar/Geolocalizacion/Geolocalizacion.aspx/GuardarLocalizacion", 
          content_type("application/json"),
          body = toJSON(
            list(
              latitud = NA,
              longitud = NA,
              noLocalizar = TRUE
            ), auto_unbox = TRUE
          ),encode = "json")

cookieList <- cookies(r) 
cookies <- cookieList$value %>% setNames(cookieList$name) 



url <- "https://www.disco.com.ar/Comprar/Home.aspx#_atCategory=false&_atGrilla=true&_id=446223"

main_page <- html_session(url,set_cookies(cookies))

如何访问以下数据(响应)(在上面的链接 2 中)?

"{"d":"{"Tipo":[{"Filtro":"Importada","IdMenu":"0","Cantidad":"17"},{"Filtro":"Otros" "IdMenu"..."

欢迎任何帮助。非常感谢!

【问题讨论】:

    标签: r web-scraping rvest httr


    【解决方案1】:

    您打印的输出是json string。您可以使用jsonlite::fromJSON 将其解析为列表/数据框。结果将是一个列表,然后您可以在其中查找您正在搜索的数据。我将您的两个代码示例组合成一个更简单的代码。

    library(httr)
    library(rvest)
    library(jsonlite)
    
    r <- POST("https://www.disco.com.ar/Comprar/HomeService.aspx/ObtenerArticulosPorDescripcionMarcaFamiliaLevex", 
              content_type("application/json"),
              body = toJSON(list(IdMenu="446223",textoBusqueda="", producto="", marca="", pager="", ordenamiento=0, precioDesde="", precioHasta=""), 
                            auto_unbox = TRUE
              ), encode = "json")
    
    data.json <- r %>% content() %>% nth(n=1) %>% fromJSON()
    

    data.json 是一个包含 5 个元素的列表。每个元素都是一个数据框,包含不同类型的数据。

    例如 data.json$ResultadosBusquedaLevex 返回一个数据框,其中包含产品列表和一些详细信息(如价格)。

    df.1 <- data.json$ResultadosBusquedaLevex
    head(df.1)
    
    
    
      IdArticulo IdArchivoSmall IdArchivoBig                              DescripcionArticulo Precio PrecioAnterior precioUnidad_1 precioUnidad_0 Stock
    1       4862     872107.jpg   872112.jpg                          Cerveza Heineken 473 Ml 110.33                            Lt         233.26    47
    2       4867     893696.jpg   893701.jpg        Cerveza Rubia Quilmes Clásica 473 Ml Lata  72.10                            Lt         152.43    43
    3       5239     893714.jpg   893719.jpg Cerveza Rubia Quilmes Clásica 6-Pack 473 Ml Lata 353.50                            Un          58.92    39
    4      12710     872125.jpg   872130.jpg                          Cerveza Heineken 330 Ml  88.81                            Lt         269.12   458
    5      84122     893776.jpg   893781.jpg           Cerveza Rubia Brahma Chopp 473 Ml Lata  79.27                            Lt         167.59    44
    6     119170     893793.jpg   893798.jpg    Cerveza Rubia Brahma Chopp 6-Pack 473 Ml Lata 364.00                            Lt         769.56   443
      StockCD IdMenu Pesable CargarCaracteristicasDelProducto Grupo_Marca Grupo_Tipo Grupo_Precio Row Articulo_Oferta CucardaOferta CucardaOferta2
    1       0      0   False                                     HEINEKEN      Otros            1   1               0                             
    2       0      0   False                                      QUILMES      Otros            1   2               0                             
    3       0      0   False                                      QUILMES      Otros            3   3               0                             
    4       0      0   False                                     HEINEKEN      Otros            1   4               0                             
    5       0      0   False                                       BRAHMA      Otros            1   5               0                             
    6       0      0   False                                       BRAHMA      Otros            3   6               0                             
      CucardaOferta3 ArticuloEnCarrito ArticuloCantidadPedida Descuentos EsMacriProd SinInteres         Categoria UnidadMult MinCompra
    1                                N                      0       NULL       FALSE            Bebidas->Cervezas          1         1
    2                                N                      0       NULL       FALSE            Bebidas->Cervezas          1         1
    3                                N                      0       NULL       FALSE            Bebidas->Cervezas          1         1
    4                                N                      0       NULL       FALSE            Bebidas->Cervezas          1         1
    5                                N                      0       NULL       FALSE            Bebidas->Cervezas          1         1
    6                                N                      0       NULL       FALSE            Bebidas->Cervezas          1         1
    
        
    

    【讨论】:

    • 非常感谢!!都非常清楚!我在执行请求时遇到问题。我得到一个输出“处理请求时出错。”。可能是什么原因?再次非常感谢!
    • 这很奇怪......我现在收到同样的请求错误。昨天它工作正常......我稍后会再试一次。但是,如果您可以让请求/响应正常工作,那么解析数据的方式(使用 fromJSON)应该仍然有效。
    猜你喜欢
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 2020-07-18
    • 1970-01-01
    • 2023-01-07
    • 2020-07-18
    • 2019-02-17
    • 2017-06-26
    相关资源
    最近更新 更多