【问题标题】:Using R to "click" a download file button on a webpage使用 R “单击”网页上的下载文件按钮
【发布时间】:2017-06-25 07:27:32
【问题描述】:

我正在尝试使用此网页http://volcano.si.edu/search_eruption.cfm 来抓取数据。有两个下拉框要求过滤数据。我不需要过滤数据,因此我将这些数据留空,然后单击“Search Eruptions”继续到下一页。

不过,我注意到的是,与它应该具有的总列数(总共 24 个)相比,生成的表只包含少量列(仅 5 个)。但是,如果您单击“将结果下载到 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")

在我的浏览器中使用检查器,我可以看到两个过滤器是“eruption_category”和“country”,因为我不需要任何过滤数据,所以两者都是空白的。

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

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

感谢您提供的任何帮助。

【问题讨论】:

  • 看起来页面使用了 JavaScript 来呈现页面。最简单和最快的方法可能是下载 Excel 文件并进行处理。数据看起来是相对静态的,因此偶尔下载应该不是问题。
  • 谢谢@Dave2e。不幸的是,我确实需要在 R 中这样做。而且,正如你所说,它主要是静态的,但仍然足够频繁地更新。

标签: r post httr rselenium


【解决方案1】:

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

我假设可以推断出“Excel”部分,但如果不是:

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

【讨论】:

  • 很好的答案,但问题表明手动下载的文件更完整,因为它有更多列(24 列而不是 5 列)。我真的很想知道如何自动下载和加载它
  • 添加它(我认为它很容易推断)
  • 感谢@hrbrmstr 的回答。 正是我需要的。
  • 嗨,在上面的示例中,您按下表单上的提交按钮。您将如何在带有“onclick”事件的javascript按钮上执行此操作: Download som Excel ark 这会返回 "could not find function" httr::POST(url=url, ExportToExcel('ambviewone')) 此致
  • @Andreas 应该是 MWE 的一个新问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2021-12-16
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多