Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用R表示;点击";网页上的下载文件按钮_R_Post_Httr_Rselenium - Fatal编程技术网

用R表示;点击";网页上的下载文件按钮

用R表示;点击";网页上的下载文件按钮,r,post,httr,rselenium,R,Post,Httr,Rselenium,我正试图使用此网页刮取数据。有两个下拉框要求筛选数据。我不需要过滤数据,所以我将这些数据留空,然后单击“搜索爆发”继续下一页 但是,我注意到,结果表只包含少量的列(只有5列),而它应该包含的列总数(总共24列)。但是,如果单击“将结果下载到Excel”按钮并打开下载的文件,则所有24列都将出现。这就是我需要的 所以,看起来这已经从一个刮擦练习(使用httr和rvest)变成了更困难的事情。然而,如何使用R实际“点击”“下载结果到Excel”按钮,我感到很困惑。我猜我将不得不使用RSelenium

我正试图使用此网页刮取数据。有两个下拉框要求筛选数据。我不需要过滤数据,所以我将这些数据留空,然后单击“搜索爆发”继续下一页

但是,我注意到,结果表只包含少量的列(只有5列),而它应该包含的列总数(总共24列)。但是,如果单击“将结果下载到Excel”按钮并打开下载的文件,则所有24列都将出现。这就是我需要的

所以,看起来这已经从一个刮擦练习(使用httr和rvest)变成了更困难的事情。然而,如何使用R实际“点击”“下载结果到Excel”按钮,我感到很困惑。我猜我将不得不使用RSelenium,但下面是我的代码,试图将httr与POST结合使用,以防你们中的任何人都能找到一种更简单的方法。我还尝试过使用gdata、data.table、XML等,但都没有用,这可能是用户错误造成的

另外,知道“下载”按钮不能右键单击以显示URL可能会有所帮助

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

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

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

url只需模仿
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>

看起来页面使用JavaScript来呈现页面。最简单、最快的方法就是下载Excel文件并处理它。数据看起来是静态的,所以偶尔下载应该不会有问题。谢谢@Dave2e。不幸的是,我确实需要在R中执行此操作。正如您所说,它大部分是静态的,但仍然足够频繁地更新。回答很好,但问题表明手动下载的文件更完整,因为它有更多列(24而不是5列)。我真的很想知道如何能够自动下载并加载它。添加它(我假设它很容易推断出来)谢谢@hrbrmstr的回答。这正是我所需要的。嗨,在上面的例子中,你按下表单上的提交按钮。您如何在javascript buttin上使用类似以下“onclick”事件执行此操作:返回“找不到函数”httr::POST(url=url,ExportToExcel('ambviewone'))Sincerely@Andreas这将是一个全新的问题
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>
POST("http://volcano.si.edu/search_eruption_excel.cfm", 
     body = list(`eruption_category[]` = "", 
                 `country[]` = ""), 
     encode = "form",
     write_disk("eruptions.xls")) -> res