2015-08-21 1 views
0

Je suis en train de télécharger automatiquement les documents pour le pétrole & puits de gaz de la Commission de conservation du pétrole et du gaz du Colorado (COGCC) en utilisant les paquets « rvest » et « téléchargeur » dans R.Télécharger les documents de la page Web ASPX dans R

Le lien vers la table/le formulaire qui contient les documents pour un puits particulier est; http://ogccweblink.state.co.us/results.aspx?id=12337064

Le « id = 12337064 » est l'identifiant unique pour le bien

Les documents sur la page du formulaire peut être téléchargé en cliquant dessus. Un exemple est ci-dessous. Le "DocumentID = 3172781" est l'ID document unique pour le document à télécharger. Dans ce cas, un fichier xlsm. D'autres formats de fichiers sur la page du document incluent PDF et xls.

Jusqu'ici j'ai été capable d'écrire un code pour télécharger n'importe quel document pour n'importe quel puits mais il est limité à seulement la première page. La majorité des puits ont des documents sur plusieurs pages et je suis incapable de télécharger des documents sur les pages autres que la page 1 (toutes les pages du document URL similaire)

## Extract the document id for document to be downloaded in this case "DIRECTIONAL DATA". Used the SelectorGadget tool to extract the CSS path 
library(rvest) 
html <- html("http://ogccweblink.state.co.us/results.aspx?id=12337064") 
File <- html_nodes(html, "tr:nth-child(24) td:nth-child(4) a") 
File <- as(File[[1]],'character') 
DocId<-gsub('[^0-9]','',File) 
DocId 
[1] "3172781" 

## To download the document, I use the downloader package 
library(downloader) 
linkDocId<-paste('http://ogccweblink.state.co.us/DownloadDocument.aspx DocumentId=',DocId,sep='') 
download(linkDocId,"DIRECTIONAL DATA" ,mode='wb') 

    trying URL 'http://ogccweblink.state.co.us/DownloadDocument.aspx?DocumentId=3172781' 
Content type 'application/octet-stream' length 33800 bytes (33 KB) 
downloaded 33 KB 

Est-ce que quelqu'un sait comment je peux modifier mon code pour télécharger des documents sur d'autres pages?

Merci beaucoup!

Em

+0

Lorsque vous chargez cette page il y a une demande de poste contenant quelque chose comme '__EVENTARGUMENT = page% 242 '. Ce paramètre semble gouverner les données que vous voyez. –

+0

Il y a des indices avec rcurl et httr [ici] (http://stackoverflow.com/questions/5797688/post-request-using-rcurl) (utilisez le kit dev dans firefox ou chrome pour voir la requête que votre navigateur envoie et imitez-les plus tard) – Tensibai

+0

Merci pour la suggestion @ user2706569. J'ai changé le Param à '__EVENTARGUMENT = Page $ 2' et relancé le code suivant trouvé sur [link] (http://stackoverflow.com/questions/15853204/how-to-login-and-then-download-a-file- from-aspx-web-pages-with-r) pour afficher les documents à la page 2 mais la demande de publication affiche toujours les documents à la première page. Le seul ajustement mineur apporté au code comprenait 'eventargument <- as.caractère ("Page $ 2"); params <- list ('__ EVENTARGUMENT' = eventargument); html = postForm ('http://ogccweblink.state.co.us/results.aspx?id=12337064', .params = params, curl = curl) ' – user2566907

Répondre

0

Vous devez utiliser le même biscuit pour la deuxième requête et transmettre les champs de viewstate et de validation ainsi. Exemple rapide:

  1. charge RCurl et charger l'URL et préserver le cookie:

    url <- 'http://ogccweblink.state.co.us/results.aspx?id=12337064' 
    library(RCurl) 
    curl <- curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = getCurlHandle()) 
    page1 <- getURL(url, curl = curl) 
    
  2. Extrait les valeurs VIEWSTATE et EVENTVALIDATION après l'analyse syntaxique du HTML:

    page1 <- htmlTreeParse(page1, useInternal = TRUE) 
    viewstate <- xpathSApply(page1, '//input[@name = "__VIEWSTATE"]', xmlGetAttr, 'value') 
    validation <- xpathSApply(page1, '//input[@name = "__EVENTVALIDATION"]', xmlGetAttr, 'value') 
    
  3. Interrogez la même URL à nouveau avec le cookie enregistré, extrait les valeurs INPUT cachées et demander le deuxième pag e:

    page2 <- postForm(url, curl = curl, 
         .params = list(
          '__EVENTARGUMENT' = 'Page$2', 
          '__EVENTTARGET'  = 'WQResultGridView', 
          '__VIEWSTATE'  = viewstate, 
          '__EVENTVALIDATION' = validation)) 
    
  4. Extrait les URL de la table figurant sur la deuxième page:

    page2 <- htmlTreeParse(page2, useInternal = TRUE) 
    xpathSApply(page2, '//td/font/a', xmlGetAttr, 'href') 
    
+0

Merci pour la réponse rapide @dococzig. J'ai utilisé votre modification de code ci-dessus et je n'ai pas pu obtenir l'ID de document imprimé pour la 2ème page à partir de la fonction 'postForm'. Les identifiants de document doivent être extraits avant de télécharger les documents depuis n'importe quelle page. Dans l'attente de votre réponse. Merci! – user2566907

+0

@ user2566907 - le 'postForm' renvoie le HTML en tant que texte, qui inclut les ID et peut être extrait par' XML' (comme je l'ai fait à la 2ème étape ci-dessus) ou 'rvest' (par votre exemple original). Sauvegardez simplement ce que 'postForm' renvoie et passez à la fonction' html' que vous avez utilisée dans votre question - ça marche bien. – daroczig

+0

J'ai fait ce que vous avez suggéré et j'ai reçu le message d'erreur suivant: Erreur dans UseMethod ("html_nodes"): aucune méthode applicable pour 'html_nodes' appliquée à un objet de classe "character" 'pour la fonction html et' Error in UseMethod ("xpathApply"): aucune méthode applicable pour 'xpathApply' appliqué à un objet de classe "character" 'pour le XML. Pourriez-vous s'il vous plaît me montrer le code qui fonctionne pour vous? Remercier! – user2566907