2017-04-26 1 views
0

Je souhaite rafraichir les résultats de la météo à cette page http://www.weather.gov.sg/climate-historical-daily. J'utilise le code donné dans ce lien Using r to navigate and scrape a webpage with drop down html forms.R pour changer les valeurs en html et égrener les données web

Cependant, je ne suis pas en mesure d'obtenir les données probablement en raison de changements dans la structure de la page. Dans le code du lien ci-dessus pgform <-html_form(pgsession)[[3]] a été utilisé pour modifier les valeurs du formulaire. Je n'ai pas pu trouver un formulaire similaire dans mon cas.

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

résultat dans mon cas

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

qui vient d'obtenir la boîte de recherche, et non pas les contrôles réels, qui ne sont pas dans une balise '

' et peut ainsi » t être traité par 'html_form'. Vous auriez probablement besoin de RSelenium. Cependant, la page a de jolis liens de téléchargement CSV, qui semblent suivre un modèle et pourraient donc probablement être téléchargés directement avec 'download.file', à condition que vous puissiez déterminer ceux dont vous avez besoin. – alistaire

+0

Merci et je suis d'accord avec vous que la page a des liens de téléchargement. Mais j'ai besoin de données pour les données des 3 dernières années, pour toutes les stations listées dans la liste déroulante. J'ai pensé que si je pouvais comprendre cette partie, je pourrais écrire une boucle pour obtenir les données. – cutepanda

Répondre

0

Depuis la page a un bouton de téléchargement CSV et les liens qu'il fournit suivre un modèle, vous pouvez générer et télécharger un ensemble d'URL. Vous aurez besoin d'un ensemble de la station ID, que vous pouvez gratter dans le menu déroulant lui-même:

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', .) 

qui peut ensuite être mis en expand.grid les mois et les années à générer toutes les combinaisons nécessaires:

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

(. Notez que si vous voulez que les données 2017, vous devrez construire les séparément et rbind pour ne pas construire des mois qui n'ont pas encore eu lieu)

Les combinaisons peuvent alors être paste0 ed dans les URL:

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

qui peut être lapply ed travers pour télécharger tous les fichiers:

# 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')})