【问题标题】:Can't validate HTML forms using R and R packages RCurl and RHTMLForms无法使用 R 和 R 包 RCurl 和 RHTMLForms 验证 HTML 表单
【发布时间】:2023-06-16 19:27:02
【问题描述】:

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

没关系尝试访问该网站的英文版,因为该链接在英文版中不存在...

很明显,有html表格可供选择:“Região ou Bacia”(地区或盆地)、“Unidade de medida”(计量单位)和“Período”。我不需要的最后一个表单。

此外,您必须从上到下依次选择表格,例如您只能在选择区域或盆地后选择测量单位。

在您选择表格并按顾问后,应该会出现一个带有表格和图表的网页。我有兴趣只提取表格。出现的网页链接是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 我没有得到预期的带有表格和图表的网页。我也尝试更改一些参数,但也没有用。

我还尝试使用 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 代码更正确,虽然我不太擅长 html...

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

【问题讨论】:

    标签: html r forms web-scraping rcurl


    【解决方案1】:

    如果您可以查看选择弹出菜单中的值(使用 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
    

    【讨论】: