R - 如何使用 rvest 或 rcurl 点击网页

Posted

技术标签:

【中文标题】R - 如何使用 rvest 或 rcurl 点击网页【英文标题】:R - How to make a click on webpage using rvest or rcurl 【发布时间】:2015-05-24 23:34:23 【问题描述】:

我想从this webpage下载数据

使用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里面有没有办法点击按钮然后抓取数据。

【问题讨论】:

@hrbrmstr 建议的另一种方法是使用 RSelenium,它可以让您自动化交互式浏览器会话。 @Thomas 我也会尝试使用 RSelenium 的方式来做,谢谢你的评论。 【参考方案1】:

有时最好在 ajax 网络请求级别解决问题。对于这个站点,您可以使用 Chrome 的开发工具并查看请求。要构建表格(也包括整个表格),它会使用各种 ajax-y 参数向站点发送POST。只需复制它,对响应进行一些数据处理即可:

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 转到页面,单击“+”,然后抓取结果表。

【讨论】:

非常感谢您的回答,接下来我将尝试使用 RSelenium 的方式来完成它。之后我会在这里分享。再次感谢。 我知道已经一年了,但是您如何找到有关发送的 ajax 内容的信息? 任何浏览器或 BurpProxy 等工具中的“开发者工具”

以上是关于R - 如何使用 rvest 或 rcurl 点击网页的主要内容,如果未能解决你的问题,请参考以下文章

[R语言] 利用RSelenium/ Rwebdriver抓取动态页面

如何使用 R 中的 rvest 通过以下方式从 Wikipedia 获取“类别”?

如何使用 R 和 rvest 轮换代理和 IP 地址

用于 Google Adwords 的 RCurl

带有 RCurl 的 sftp 协议 - 最后一步,如何将 R 路径从 usr/lib 更改为 usr/local/lib

R:rvest提取innerHTML