2017-02-07 2 views
5

このウェブページhttp://volcano.si.edu/search_eruption.cfmを使用してデータをスクラップしようとしています。データのフィルタを要求する2つのドロップダウンボックスがあります。私はフィルタリングされたデータを必要としないので、それらを空白のままにして、 "Search Eruptions"をクリックして次のページに進みます。Rを使用してウェブページのダウンロードファイルボタンをクリックする

私が気づいたことは、得られたテーブルには、列の総量(合計24)と比較して少量の列(わずか5)しか含まれていないことです。ただし、「ダウンロード結果をExcel」ボタンをクリックしてダウンロードしたファイルを開くと、24列すべてが表示されます。これは私が必要とするものです。

これは、これがスクラップ練習(httrとrvestを使用)からより困難なものに変わったようです。しかし、実際に ""をExcelをダウンロードするには、 ""というボタンをクリックするのが難しいです。私の推測では、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") 

、私は2つのフィルタが「eruption_category」と「国」であり、私はフィルタリングされたデータを必要としないので、両方が空白になることを見ることができました。

最後に、上記のコードは、わずか5列のテーブルを持つページに表示されるようです。しかし、以下のコードでは、(SelectorGadgetを使用して1つの列のみをスクレープする)rvestを使用してこのテーブルをスクラップすることはできませんでした。結局のところ、この部分はあまり重要ではありません。なぜなら、上記のように、これらの5つだけでなく、24の列がすべて必要であるからです。しかし、私が下で行ったことに誤りがあれば、感謝します。 。

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> 

が推測され、そうでない場合ことができます:

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

偉大な答えですが、手動でダウンロードされたファイルはより多くの列(25ではなく24)を持っているため、より完全であるとの質問があります。私は実際にそれを自動的にダウンロードしてロードすることが可能であることを知りたいです – GGamba

+2

追加されました(私は簡単に外挿されているはずです) – hrbrmstr

+0

この回答は@hrbrmstrありがとうございます。それは**まさに私が必要とした**です。 – abet

関連する問題