使用R来"点击"网页上的下载文件按钮

时间:2017-02-07 21:22:41

标签: r post httr rselenium

我正在尝试使用此网页http://volcano.si.edu/search_eruption.cfm来抓取数据。有两个下拉框要求过滤数据。我不需要过滤数据,因此我将其留空并继续点击" 搜索喷发"继续下一页。

但是,我注意到,结果表只包含少量列(仅5个),而不是它应该具有的总列数(总共24个)。但是,如果您单击" 将结果下载到Excel "那么所有24列都将在那里。按钮并打开下载的文件。这就是我需要的。

所以,看起来这已经从一次刮痧练习(使用httr和rvest)转变为更困难的事情。但是,我很难知道如何实际点击"在" 将结果下载到Excel "使用R的按钮。我的猜测是我将不得不使用RSelenium,但这里是我的代码试图使用POST的httr以防万一有一个人可以找到的更简单的方法。我也尝试过使用gdata,data.table,XML等无济于事,这可能只是用户错误的结果。

此外,知道无法右键单击下载按钮以显示URL可能会有所帮助。

url <- "http://volcano.si.edu/search_eruption_results.cfm"

searchcriteria <- list(
    eruption_category = "",
    country = ""
)

mydata <- POST(url, body = "searchcriteria")

在我的浏览器中使用Inspector,我能够看到两个过滤器是&#34; eruption_category&#34;和#34;国家&#34;因为我不需要任何过滤数据,所以两者都是空白的。

最后,似乎上面的代码会让我进入只有5列的表的页面。但是,我仍然无法在下面的代码中使用rvest来刮掉这个表(使用SelectorGadget来刮掉一列)。最后,这部分并不重要,因为正如我上面所说,我需要所有24列,而不仅仅是这些5列。但是,如果你发现我在下面做的任何错误,我会心怀感激。

Eruptions <- mydata %>%
    read_html() %>%
    html_nodes(".td8") %>%
    html_text()
Eruptions

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:4)

只是模仿它所做的POST

library(httr)
library(rvest)
library(purrr)
library(dplyr)

POST("http://volcano.si.edu/search_eruption_results.cfm",
     body = list(bp = "", `eruption_category[]` = "", `country[]` = "", polygon = "",  cp = "1"),
     encode = "form") -> res

content(res, as="parsed") %>%
  html_nodes("div.DivTableSearch") %>%
  html_nodes("div.tr") %>%
  map(html_children) %>%
  map(html_text) %>%
  map(as.list) %>%
  map_df(setNames, c("volcano_name", "subregion", "eruption_type",
                     "start_date", "max_vei", "X1")) %>%
  select(-X1)
## # A tibble: 750 × 5
##    volcano_name            subregion      eruption_type  start_date
##           <chr>                <chr>              <chr>       <chr>
## 1   Chirinkotan        Kuril Islands Confirmed Eruption 2016 Nov 29
## 2   Zhupanovsky  Kamchatka Peninsula Confirmed Eruption 2016 Nov 20
## 3       Kerinci              Sumatra Confirmed Eruption 2016 Nov 15
## 4       Langila          New Britain Confirmed Eruption  2016 Nov 3
## 5     Cleveland     Aleutian Islands Confirmed Eruption 2016 Oct 24
## 6         Ebeko        Kuril Islands Confirmed Eruption 2016 Oct 20
## 7        Ulawun          New Britain Confirmed Eruption 2016 Oct 11
## 8      Karymsky  Kamchatka Peninsula Confirmed Eruption  2016 Oct 5
## 9        Ubinas                 Peru Confirmed Eruption  2016 Oct 2
## 10      Rinjani Lesser Sunda Islands Confirmed Eruption 2016 Sep 27
## # ... with 740 more rows, and 1 more variables: max_vei <chr>

我认为&#34; Excel&#34;部分可以推断,但如果不是:

POST("http://volcano.si.edu/search_eruption_excel.cfm", 
     body = list(`eruption_category[]` = "", 
                 `country[]` = ""), 
     encode = "form",
     write_disk("eruptions.xls")) -> res