无法使用 R 和 R 包 RCurl 和 RHTMLForms 验证 HTML 表单

Can't validate HTML forms using R and R packages RCurl and RHTMLForms

我正在尝试使用 R 从这个巴西网站提取 energy/water 数据:http://www.ons.org.br/historico/energia_natural_afluente.aspx

没关系尝试访问网站的英文版,因为这个 link 在英文版中不存在...

可以清楚地看到,selection有html种形式:"Região ou Bacia"(地区或盆地),"Unidade de medida"(计量单位)和"Período"。我不需要的最后一个表格。

此外,您必须 select 按从上到下的顺序填写表格,例如,在 select 一个区域或盆地之后,您只能 select 测量单位。

在您 select 编辑表格并按咨询后,应该会出现一个带有 table 和图表的网页。我只想提取 table。显示的网页的 link 是 http://www.ons.org.br/historico/energia_natural_afluente_out.aspx 因此您必须验证这些表格才能访问该网页。

起初我尝试使用 XML 包和 RHTMLForms(可在 omegahat 获得),但没有成功,如下所示。

library(XML)
library(RCurl)
library(RHTMLForms)
x <- getHTMLFormDescription("http://www.ons.org.br/historico/energia_natural_afluente.aspx", 
encoding = "utf-8")

检查 x 的内容我发现我感兴趣的形式位于 x[[4]]:

 > x[[4]]
HTML Form: http://www.ons.org.br/historico/energia_natural_afluente_out.aspx 
passo1: [ -1 ]  -1, SE, S, NE, N, Grande, Paranaiba, Tiete, Paranapanema, Parana, Iguacu, Uruguai, Jacui, Capivari, Paraguai, Paraiba_do_sul, Doce, Itabapoana, São_francisco, Parnaiba, Tocantins, Amazonas, Selecione, Paranaíba, Tietê, Paraná, Iguaçu, Paraguai (a partir de 2001), Paraíba do Sul, Itabapoana (a partir de 2001), São Francisco, Parnaíba, Amazonas (a partir de 2001)
passo2a: [ -1 ]  -1, Selecione
passo2b: [ -1 ]  -1, MWmed, MLT, Selecione, %MLT
passo3a: [ -1 ]  -1, Selecione
passo3b: [ -1 ]  -1, 2016, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000, Selecione
comparar: 1
passo4a: [ -1 ]  -1, Selecione
passo4b: [ -1 ]  -1, 2015, 2014, 2013, 2012, 2011, 2010, 2009, 2008, 2007, 2006, 2005, 2004, 2003, 2002, 2001, 2000, Selecione

使用 RHTMLForms 中的 createFunction:

fun1 <- createFunction(x[[4]])

然后我尝试将所有参数传递给函数:

X <- fun1(passo1 = "SE", passo2a = "-1", passo2b = "MWmed", passo3a = "-1", passo3b = "2014", comparar = "", passo4a = "-1", passo4b = "2009")

但是检查对象 X 我没有按预期获得带有 table 和图表的网页。我也尝试更改一些参数,但也没有用。

我还尝试使用 RCurl 包中的 getForm 和 postForm:

test <- getForm("http://www.ons.org.br/historico/energia_natural_afluente.aspx", .params = list(passo1 = "NE", passo2b = "MWmed", passo3b = 2014))

teste2 <- postForm("http://www.ons.org.br/historico/energia_natural_afluente.aspx",.params = list(passo1 = "SE", passo2a = -1, passo2b = "MWmed", passo3a = -1, passo3b = 2014, comparar = 1, passo4a = -1, passo4b = 2009))

但不幸的是,这也没有奏效。检查 html 中的代码 我认为 post 更正确,尽管我不太擅长 html...

有人可以帮我抓取网页吗?

如果您可以查看 select 弹出菜单中的值(使用 Chrome/Safari/Firefox 开发人员工具),您只需发出 POST 请求即可获取这些值:

library(xml2)
library(httr)
library(rvest)

req <- POST(verb = "POST", 
     url = "http://www.ons.org.br/historico/energia_natural_afluente_out.aspx", 
     body = list(passo1 = "Jacui", 
                 passo2a = "-1", 
                 passo2b = "MLT", 
                 passo3a = "-1", 
                 passo3b = "2008", 
                 tipo = "bacia", 
                 passo2 = "MLT", 
                 passo3 = "2008", 
                 passo4 = "-1", 
                 passo1text = "Jacui", 
                 passo2text = "%MLT", 
                 passo3text = "2008",
                 passo4text = "-1"), 
     encode = "form") 

content(req, as="text") %>% 
  read_html() %>% 
  html_nodes("table.tabelaHistorico") %>% 
  html_table()

## [[1]]
##     X1     X2
## 1        2008
## 2  Jan  69,43
## 3  Fev  37,45
## 4  Mar  43,79
## 5  Abr  40,78
## 6  Mai  47,73
## 7  Jun  76,79
## 8  Jul  52,65
## 9  Ago  77,64
## 10 Set  54,15
## 11 Out 170,89
## 12 Nov 186,74
## 13 Dez  78,41