【问题标题】:How to fix data reading and table formatting problem with web scrapin in R如何解决 R 中网络抓取的数据读取和表格格式问题
【发布时间】:2021-07-21 02:28:28
【问题描述】:

首先是如何以编程方式访问此在线表格中的 11 个页面。

由于这是一个简单的 html 表格,使用“Next”(下一步)按钮将带我们进入一个新页面。如果我们在 Next page 上查看 URL,我们可以在查询参数中看到页码。

" ... tienda-virtual-del-estado-colombiano / ordenes-compra? page = 1 & number_order = & estado ..."

我们知道页面从 0 开始编号(因为“next”会将我们带到第 1 页),使用导航栏我们可以看到有 11 个页面。 httr 包提供了许多非常有用的工具来处理 html 请求。这些工具中有 httr :: parse_url 函数,它返回一个包含 URL 组件的列表。

url_params <- httr::parse_url("https://colombiacompra.gov.co/tienda-virtual-del-estado-colombiano/ordenes-compra?page=1&number_order=&state=&entity=&tool=IAD%20Software%20I%20-%20Microsoft&date_to_=%20&date_from_=")

# Not all results returned were included below for the sake of keeping the example concise

$scheme
[1] "https"

$hostname
[1] "colombiacompra.gov.co"

$path
[1] "tienda-virtual-del-estado-colombiano/ordenes-compra"

$query
$query$page
[1] "1"

$query$number_order
[1] ""

使用查询参数构造一系列与页码对应的rvest::read_html()调用,只需用lapply和paste0替换page=即可。我们还可以通过将 data.frame 强制到应用中来节省一些时间。

pages <-
  lapply(0:11, function(x) {
    read_html(x = paste0("https://colombiacompra.gov.co/tienda-virtual-del-estado-colombiano/ordenes-compra?page=", 
                         x, 
                         "&number_order=&state=&entity=&tool=IAD%20Software%20I%20-%20Microsoft&date_to_=%20&date_from_=")) |>
      html_table() |>
      data.frame()
  })

do.call(rbind, pages)

But I have the following error

  > url_params <- httr::parse_url("https://colombiacompra.gov.co/tienda-virtual-del-estado-colombiano/ordenes-compra?page=1&number_order=&state=&entity=&tool=IAD%20Software%20I%20-%20Microsoft&date_to_=%20&date_from_=")
    > 
    > pages <- lapply(0:11, function(x) {
    +   rvest::read_html(x = paste0("https://colombiacompra.gov.co/tienda-virtual-del-estado-colombiano/ordenes-compra?page=", 
    +                          x, 
    +                          "&number_order=&state=&entity=&tool=IAD%20Software%20I%20-%20Microsoft&date_to_=%20&date_from_=")) |>
    Error: inesperado '>' in:
    "                         x, 
                             "&number_order=&state=&entity=&tool=IAD%20Software%20I%20-%20Microsoft&date_to_=%20&date_from_=")) |>"
    >       html_table() |>
    Error: inesperado '>' in "      html_table() |>"
    >       data.frame()
    data frame with 0 columns and 0 rows
    >   })
    Error: inesperado '}' in "  }"
    > 
    > do.call(rbind, pages)
    Error in do.call(rbind, pages) : objeto 'pages' no encontrado
    > 
    > do.ca
    Error: objeto 'do.ca' no encontrado

我该如何解决?

【问题讨论】:

  • 您收到的错误表明您使用的 R 版本无法识别新管道 |&gt;。即,您正在使用 R
  • 此外,如果您在通话之间没有暂停,colombiacompra.gov.co 很可能会将您踢出或禁止您的 IP。即,在循环中添加暂停或创建一个包含暂停的函数。
  • ¿Cómo puedo traer todos los registros en la columna Instrumento sin limitarlo a solo "tool = IAD% 20Software% 20I% 20-% 20Microsoft"?
  • El servidor usa un API Rest,donde la query está compuesta por pares de variable y unidad。 Al parecer el par que requieres tiene la variable llamada “工具”。 Tienes que cambiarle la unidad por alguna otra que no sea la de Microsoft。 tool=IAD%20Software%20I%20-%20Microsoft Al parecer puedes ver el nombre de las variables disponibles en el menu de título 'Instrumento'。 Por ejemplo, esta query busca en 'Grandes Superficies': tool=Grandes%20Superficies
  • 我不希望它有一个过滤器,我希望它给我带来所有的“工具”记录,而不是将其限制为一个,并拥有一个包含所有“工具”的单一基地记录。

标签: r


【解决方案1】:

您可以使用map_df从每个url中读取html表格,并组合成一个表格。

urls <- paste0("https://colombiacompra.gov.co/tienda-virtual-del-estado-colombiano/ordenes-compra?page=", 
       0:11, 
       "&number_order=&state=&entity=&tool=IAD%20Software%20I%20-%20Microsoft&date_to_=%20&date_from_=")

library(rvest)

res <- purrr::map_df(urls, ~.x %>% read_html() %>% html_table) 

res
# A tibble: 578 x 6
#    `Orden de Compra` `Entidad Estatal`  `Fecha de la or… Estado Instrumento Total
#               <int> <chr>              <chr>            <chr>  <chr>       <chr>
# 1             72683 UNIDAD ADMINISTRA… 2021-07-16 20:0… Emiti… IAD Softwa… $453…
# 2             72670 SUPERINTENDENCIA … 2021-07-16 16:5… Emiti… IAD Softwa… $252…
# 3             72648 BOGOTA D.C - UNID… 2021-07-16 14:4… Emiti… IAD Softwa… $179…
# 4             72638 ESTABLECIMIENTO P… 2021-07-16 14:1… Emiti… IAD Softwa… $1,7…
# 5             72631 INPEC - ESTABLECI… 2021-07-16 12:5… Emiti… IAD Softwa… $1,6…
# 6             72605 POLICIA NACIONAL … 2021-07-15 20:0… Emiti… IAD Softwa… $2,9…
# 7             72524 FOGAFIN            2021-07-15 08:4… Emiti… IAD Softwa… $5,9…
# 8             72502 INSTITUTO DE FOME… 2021-07-14 22:2… Emiti… IAD Softwa… $1,9…
# 9             72471 ANTIOQUA - MUNICI… 2021-07-14 09:5… Emiti… IAD Softwa… $28,…
#10             72433 AGENCIA DE RENOVA… 2021-07-13 16:2… Emiti… IAD Softwa… $282…
# … with 568 more rows 

【讨论】:

  • 我不希望它有一个过滤器,我希望它给我带来所有的“工具”记录,而不是将其限制为一个,并拥有一个包含所有“工具”的单一基地记录。 ¿我是怎么做到的?
猜你喜欢
  • 1970-01-01
  • 2013-11-13
  • 2021-07-25
  • 2023-02-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 2018-08-01
相关资源
最近更新 更多