R-Cómo hacer un clic en la página web usando rvest o rcurl
web-scraping (1)
Quiero descargar datos de esta página web.
Los datos se pueden rvest
fácilmente con rvest
.
El código tal vez así:
library(rvest)
library(pipeR)
url <- "http://www.tradingeconomics.com/"
css <- "#ctl00_ContentPlaceHolder1_defaultUC1_CurrencyMatrixAllCountries1_GridView1"
data <- url %>>%
html() %>>%
html_nodes(css) %>>%
html_table()
Pero hay un problema para páginas web como esta.
Hay un botón +
para mostrar los datos de todos los países, pero el valor predeterminado es solo datos de 50 países.
Entonces, si uso el código, puedo raspar datos de 50 países.
El botón +
está hecho en javascript
, así que quiero saber si hay una forma en R
hacer clic en el botón y luego raspar los datos.
A veces es mejor atacar el problema en el nivel de solicitud web de ajax. Para este sitio, puedes usar las herramientas de desarrollo de Chrome y ver las solicitudes. Para construir la tabla (la tabla completa, también) hace un POST
al sitio con varios parámetros ajax-y. Simplemente replica eso, haz un poco de recopilación de datos de la respuesta y listo:
library(httr)
library(rvest)
library(dplyr)
res <- POST("http://www.tradingeconomics.com/",
encode="form",
user_agent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.50 Safari/537.36"),
add_headers(`Referer`="http://www.tradingeconomics.com/",
`X-MicrosoftAjax`="Delta=true"),
body=list(
`ctl00$AjaxScriptManager1$ScriptManager1`="ctl00$ContentPlaceHolder1$defaultUC1$CurrencyMatrixAllCountries1$UpdatePanel1|ctl00$ContentPlaceHolder1$defaultUC1$CurrencyMatrixAllCountries1$LinkButton1",
`__EVENTTARGET`="ctl00$ContentPlaceHolder1$defaultUC1$CurrencyMatrixAllCountries1$LinkButton1",
`srch-term`="",
`ctl00$ContentPlaceHolder1$defaultUC1$CurrencyMatrixAllCountries1$GridView1$ctl01$DropDownListCountry`="top",
`ctl00$ContentPlaceHolder1$defaultUC1$CurrencyMatrixAllCountries1$ParameterContinent`="",
`__ASYNCPOST`="false"))
res_t <- content(res, as="text")
res_h <- paste0(unlist(strsplit(res_t, "/r/n"))[-1], sep="", collapse="/n")
css <- "#ctl00_ContentPlaceHolder1_defaultUC1_CurrencyMatrixAllCountries1_GridView1"
tab <- html(res_h) %>%
html_nodes(css) %>%
html_table()
tab[[1]]$COUNTRIESWORLDAMERICAEUROPEASIAAUSTRALIAAFRICA
glimpse(tab[[1]]
Otra alternativa hubiera sido usar RSelenium para ir a la página, hacer clic en "+" y luego raspar la tabla resultante.