R - Как сделать клик на веб-странице, используя rvest или rcurl

Я хочу загрузить данные с этой страницы

Данные можно легко rvest с помощью rvest.

Код может быть следующим:

library(rvest)
library(pipeR)
url <- "http://www.tradingeconomics.com/"
css <-     "#ctl00_ContentPlaceHolder1_defaultUC1_CurrencyMatrixAllCountries1_GridView1"

data <- url %>>%
  html() %>>%
  html_nodes(css) %>>%
  html_table() 

Но есть проблемы для таких веб-страниц.

Существует кнопка +, отображающая данные всех стран, но по умолчанию это данные только из 50 стран.

Поэтому, если я использую код, я могу просто скопировать данные из 50 стран.

Кнопка + сделана в javascript, поэтому я хочу знать, есть ли способ в R чтобы нажать кнопку, а затем очистить данные.

Ответы

Ответ 1

Иногда лучше атаковать проблему на уровне веб-запроса ajax. Для этого сайта вы можете использовать инструменты Chrome dev и просматривать запросы. Чтобы построить таблицу (вся таблица тоже), она делает POST на сайт с различными параметрами ajax-y. Просто повторите это, сделайте немного обработки данных ответа, и вы хорошо пойдете:

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]]

Другой альтернативой было бы использование RSelenium для перехода на страницу, щелчок "+", а затем очистка итоговой таблицы.