2017-04-26 1 views
0

Ich möchte die historischen Wetterdaten von dieser Seite http://www.weather.gov.sg/climate-historical-daily kratzen.R zum Ändern der Werte in HTML-Formular und scrape Web-Daten

Ich verwende den in diesem Link angegebenen Code Using r to navigate and scrape a webpage with drop down html forms.

Ich bin jedoch nicht in der Lage, die Daten wahrscheinlich aufgrund von Änderungen in der Struktur der Seite zu erhalten. In dem Code aus dem obigen Link wurde pgform <-html_form(pgsession)[[3]] verwendet, um die Werte des Formulars zu ändern. Ich konnte in meinem Fall keine ähnliche Form finden.

url <- "http://www.weather.gov.sg/climate-historical-daily" 
pgsession <- html_session(url) 
pgsource <- read_html(url) 
pgform <- html_form(pgsession) 

Ergebnis in meinem Fall

> pgform 
[[1]] 
<form> 'searchform' (GET http://www.weather.gov.sg/) 
<button submit> '<unnamed> 
<input text> 's': 
+0

Das gerade ist das Suchfeld immer, nicht die eigentlichen Kontrollen, die nicht in einem '

' Tag sind und somit‘ t behandelt werden durch 'html_form'. Sie würden wahrscheinlich RSelenium brauchen. Die Seite hat jedoch nette CSV-Download-Links, die einem Muster zu folgen scheinen und daher wahrscheinlich direkt mit 'download.file' heruntergeladen werden können, vorausgesetzt, Sie können herausfinden, welche Sie benötigen. – alistaire

+0

Vielen Dank und ich stimme Ihnen zu, dass die Seite Download-Links enthält. Aber ich brauche Daten für die letzten 3 Jahre Daten für alle Stationen in der Dropdownliste. Ich dachte, wenn ich diesen Teil herausfinden kann, kann ich eine Schleife schreiben, um die Daten zu bekommen. – cutepanda

Antwort

0

Da die Seite eine CSV-Download-Button hat und die Verbindungen bietet es ein Muster folgen, können Sie eine Reihe von URLs generieren und herunterzuladen. Sie werden eine Reihe von der Stations-IDs benötigen, die Sie aus der Drop-Down-schaben kann sich:

library(rvest) 

page <- 'http://www.weather.gov.sg/climate-historical-daily' %>% read_html() 

station_id <- page %>% html_nodes('button#cityname + ul a') %>% 
    html_attr('onclick') %>% # If you need names, grab the `href` attribute, too. 
    sub(".*'(.*)'.*", '\\1', .) 

, die dann in expand.grid mit den Monaten und Jahren gestellt werden können, alle notwendigen Kombinationen zu generieren:

df <- expand.grid(station_id, 
        month = sprintf('%02d', 1:12), 
        year = 2014:2016) 

(. Beachten Sie, wenn Sie 2017 Daten möchten, müssen Sie diejenigen separat konstruieren und rbind, um nicht Monate zu konstruieren, die noch nicht geschehen)

Die Kombinationen können dann paste0 ed in URLs sein:

urls <- paste0('http://www.weather.gov.sg/files/dailydata/DAILYDATA_', 
       df$station_id, '_', df$year, df$month, '.csv') 

die lapply ed über sein können alle Dateien herunterladen:

# Warning! This will download a lot of files! Make sure you're in a clean directory.  
lapply(urls, function(url){download.file(url, basename(url), method = 'curl')})