【发布时间】: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 版本无法识别新管道
|>。即,您正在使用 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-%20MicrosoftAl 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