用R表示;点击";网页上的下载文件按钮
我正试图使用此网页刮取数据。有两个下拉框要求筛选数据。我不需要过滤数据,所以我将这些数据留空,然后单击“搜索爆发”继续下一页 但是,我注意到,结果表只包含少量的列(只有5列),而它应该包含的列总数(总共24列)。但是,如果单击“将结果下载到Excel”按钮并打开下载的文件,则所有24列都将出现。这就是我需要的 所以,看起来这已经从一个刮擦练习(使用httr和rvest)变成了更困难的事情。然而,如何使用R实际“点击”“下载结果到Excel”按钮,我感到很困惑。我猜我将不得不使用RSelenium,但下面是我的代码,试图将httr与POST结合使用,以防你们中的任何人都能找到一种更简单的方法。我还尝试过使用gdata、data.table、XML等,但都没有用,这可能是用户错误造成的 另外,知道“下载”按钮不能右键单击以显示URL可能会有所帮助用R表示;点击";网页上的下载文件按钮,r,post,httr,rselenium,R,Post,Httr,Rselenium,我正试图使用此网页刮取数据。有两个下拉框要求筛选数据。我不需要过滤数据,所以我将这些数据留空,然后单击“搜索爆发”继续下一页 但是,我注意到,结果表只包含少量的列(只有5列),而它应该包含的列总数(总共24列)。但是,如果单击“将结果下载到Excel”按钮并打开下载的文件,则所有24列都将出现。这就是我需要的 所以,看起来这已经从一个刮擦练习(使用httr和rvest)变成了更困难的事情。然而,如何使用R实际“点击”“下载结果到Excel”按钮,我感到很困惑。我猜我将不得不使用RSelenium
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