R - Как сделать клик на веб-странице с помощью rvest или rcurl

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

Данные можно легко очистить с помощью 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 способ нажать кнопку и затем очистить данные.


person yan zhuang    schedule 21.03.2015    source источник
comment
Альтернативный подход к предложению @ hrbrmstr - использовать RSelenium, который позволит вам автоматизировать интерактивный сеанс браузера.   -  person Thomas    schedule 21.03.2015
comment
@Thomas Я также попробую сделать это с помощью RSelenium, спасибо за ваш комментарий.   -  person yan zhuang    schedule 22.03.2015


Ответы (1)


Иногда лучше решить проблему на уровне веб-запроса ajax. Для этого сайта вы можете использовать инструменты разработчика Chrome и наблюдать за запросами. Для построения таблицы (а также всей таблицы) он делает 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 для перехода на страницу, щелкнуть «+» и затем очистить результирующую таблицу.

person hrbrmstr    schedule 21.03.2015
comment
Большое спасибо за ваш ответ, в следующий раз я попробую сделать это с помощью RSelenium. И я поделюсь этим здесь после этого. Спасибо еще раз. - person yan zhuang; 22.03.2015
comment
Я знаю, что прошел год, но как найти информацию об отправленном ajax-контенте? - person François M.; 21.06.2016
comment
Инструменты разработчика в любом браузере или такой инструмент, как BurpProxy - person hrbrmstr; 21.06.2016