2017-02-07 3 views
5

Я пытаюсь использовать эту веб-страницу http://volcano.si.edu/search_eruption.cfm для очистки данных. Есть два раскрывающихся окна, в которых запрашиваются фильтры данных. Мне не нужны отфильтрованные данные, поэтому я оставлю их пустыми и перейду к следующей странице, нажав «Search Eemptions».Использование R для «щелчка» кнопки файла загрузки на веб-странице

Однако я заметил, что итоговая таблица содержит только небольшое количество столбцов (всего 5) по сравнению с общим количеством столбцов (всего 24), которое оно должно иметь. Тем не менее, все 24 столбца будут доступны, если вы нажмете кнопку «Загрузить результаты в Excel» и откройте загруженный файл. Это то, что мне нужно.

Итак, похоже, что это превратилось из упражнения на скрежет (используя httr и rvest) во что-то более сложное. Тем не менее, я в тупике о том, как на самом деле «нажимать» на «Загрузить результаты в Excel» с использованием R. Мое предположение: мне придется использовать RSelenium, но вот мой код пытается использовать httr с POST в случае есть более простой способ, который любой из вас добрый человек может найти. Я также пытался использовать gdata, data.table, XML и т. Д. Безрезультатно, что может быть просто результатом ошибки пользователя.

Кроме того, было бы полезно знать, что кнопка загрузки не может быть нажата правой кнопкой мыши, чтобы показать URL-адрес.

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

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

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

Использования инспектора в моем браузере, я был в состоянии видеть, что два фильтра «eruption_category» и «страна» и как будет пустыми, так как я не нужен никакое отфильтрованного данные.

И, наконец, кажется, что приведенный выше код заставит меня перейти на страницу с таблицей с 5 столбцами. Тем не менее, я все еще не смог очистить эту таблицу, используя rvest в приведенном ниже коде (с помощью SelectorGadget, чтобы очистить только один столбец). В конце концов, эта часть не имеет значения, потому что, как я сказал выше, мне нужны все 24 столбца, а не только эти 5. Но если вы обнаружите какие-либо ошибки в том, что я сделал ниже, я был бы благодарен ,

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

Благодарим за помощь, которую вы можете предоставить.

+0

Похоже, на странице используется JavaScript, чтобы оказать стр. Самый простой и быстрый способ - просто загрузить файл Excel и обработать его. Данные выглядят как релевантно статические, поэтому случайная загрузка не должна быть проблемой. – Dave2e

+0

Спасибо @ Dave2e. К сожалению, мне нужно **, чтобы делать это в R. И, как вы сказали, он в основном статичен, но все еще обновляется достаточно часто. – abet

ответ

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> 

Я предположил, часть «Excel» можно сделать вывод, но если нет:

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

Отличный ответ, но в нем указано, что файл, загруженный вручную, является более полным, так как он имеет больше столбцов (24 вместо 5). Мне бы очень хотелось узнать, как можно было бы автоматически загрузить и загрузить его. – GGamba

+2

Добавлено (я предположил, что это было бы легко экстраполировано) – hrbrmstr

+0

Спасибо @hrbrmstr за этот ответ. Это именно то, что мне нужно. – abet