2015-04-01 12 views
6

Sono nuovo a R e rvest. Sto cercando di utilizzarli per ottenere informazioni da un sito Web (www.medicinescomplete.com) che consente l'accesso utilizzando il sistema di accesso accademico di Atene. In un browser, quando si fa clic sul pulsante di accesso di Atene, si passa a un modulo di accesso di Atene. Dopo aver inviato le credenziali dell'utente, il modulo reindirizza il browser al sito originale ma effettua l'accesso.seguire un reindirizzamento pagina utilizzando rvest in R

Ho utilizzato la funzione submit_form() per inviare le credenziali al modulo atene e questo restituisce un codice di 200. Tuttavia, R non segue il reindirizzamento come farebbe un browser e se utilizzo il comando jump_to() per tornare al sito originale non è loggato. Sospetto che il link reindirizzato restituito dalla pagina di accesso possa contenere il log in credenziali ho bisogno ma non so come trovare il link e inviarlo usando rvest

Qualcuno ha capito come accedere tramite athens usando rvest o ha qualche idea su come farlo seguire un reindirizzamento automatico ??

Il codice che ho usato per arrivare a questo punto è (credenziali di accesso cambiato):

library(rvest) 
library(magrittr) 

url <- "https://www.medicinescomplete.com/about/" 
mcsession <- html_session(url) 
mcsession <- jump_to(mcsession, "/mc/athens.htm? uri=https%3A%2F%2Fwww.medicinescomplete.com%2Fabout%2F") 
athensform <- html_form(mcsession)[[1]] 
athensform <-set_values(athensform, ath_uname = "xxx", ath_passwd = "yyy") 
submit_form(mcsession, athensform) 
jump_to(mcsession, "https://www.medicinescomplete.com/mc/bnf/current/") 

ottengo 200 del codice per il passo submit_form(), ma un codice 403 proibito per la jump_to() ultima riga.

Ho quindi collegato il passaggio submit_form in html() e stampato. Da quello che ho potuto capire è stato un login di successo ma nel corpo della pagina principale c'è una linea che si riferisce al reindirizzamento verso il sito originale. Il codice HTML per l'intera pagina è troppo lungo per inviare ma il bit in questione sembra essere:

<div style="padding: 8px;" id="logindiv"> 
         <form method="POST" action="https://www.medicinescomplete.com/mc/athens"> 
          Please wait while we transfer you. <br><noscript>JavaScript disabled, please<input type="submit" value="click here" style="border:none;background:none;text-decoration:underline;color:#E27B2F;"> 

e mi chiedo se questo bit seguente si riferisce a qualche chiave di accesso:

<input type="hidden" name="TARGET" value="https://www.medicinescomplete.com/about/" style="display:none"><input type="hidden" name="RelayState" value="https://www.medicinescomplete.com/about/" style="display:none"><input type="hidden" name="SAMLResponse" value="PFJlc3BvbnNlIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6YXNzZXJ0aW9uIiBEZXN... 

Aha! Più in basso nella pagina c'è questo:

<script> 
window.onload = function() { document.forms[0].submit(); } 
</script> 

penso che la finestra ha lo scopo di inviare automaticamente un altro modulo che esegue il post per il sito medicinescomplete.com originale per l'autenticazione tramite il campo nascosto come una credenziale di accesso. Tuttavia, nel provare a usare submit_form() su questa pagina, non sembra che tu riesca più a raggiungerlo! Ho aggiunto la seguente linea per cercare di capire cosa sta succedendo:

> submit_form(mcsession, athensform) %>% html_form() %>% str() 

e questo dà il seguente risultato:

Submitting with 'submit' 
List of 1 
$ :List of 5 
    ..$ name : chr "<unnamed>" 
    ..$ method : chr "POST" 
    ..$ url : chr "https://www.medicinescomplete.com/mc/athens" 
    ..$ enctype: chr "form" 
    ..$ fields :List of 4 
    .. ..$ NULL  :List of 7 
    .. .. ..$ name : NULL 
    .. .. ..$ type : chr "submit" 
    .. .. ..$ value : chr "click here" 
    .. .. ..$ checked : NULL 
    .. .. ..$ disabled: NULL 
    .. .. ..$ readonly: NULL 
    .. .. ..$ required: logi FALSE 
    .. .. ..- attr(*, "class")= chr "input" 
    .. ..$ TARGET  :List of 7 
    .. .. ..$ name : chr "TARGET" 
    .. .. ..$ type : chr "hidden" 
    .. .. ..$ value : chr "https://www.medicinescomplete.com/about/" 
    .. .. ..$ checked : NULL 
    .. .. ..$ disabled: NULL 
    .. .. ..$ readonly: NULL 
    .. .. ..$ required: logi FALSE 
    .. .. ..- attr(*, "class")= chr "input" 
    .. ..$ RelayState :List of 7 
    .. .. ..$ name : chr "RelayState" 
    .. .. ..$ type : chr "hidden" 
    .. .. ..$ value : chr "https://www.medicinescomplete.com/about/" 
    .. .. ..$ checked : NULL 
    .. .. ..$ disabled: NULL 
    .. .. ..$ readonly: NULL 
    .. .. ..$ required: logi FALSE 
    .. .. ..- attr(*, "class")= chr "input" 
    .. ..$ SAMLResponse:List of 7 
    .. .. ..$ name : chr "SAMLResponse" 
    .. .. ..$ type : chr "hidden" 
    .. .. ..$ value : chr "PFJlc3BvbnNlIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA6cHJvdG9jb2wiIHhtbG5zOnNhbWwyPSJ1cm46b2FzaXM6bmFtZXM6dGM6U0FNTDoyLjA"| __truncated__ 
    .. .. ..$ checked : NULL 
    .. .. ..$ disabled: NULL 
    .. .. ..$ readonly: NULL 
    .. .. ..$ required: logi FALSE 
    .. .. ..- attr(*, "class")= chr "input" 
    .. ..- attr(*, "class")= chr "fields" 
    ..- attr(*, "class")= chr "form" 

mi sento come le informazioni in questa forma dovrebbe permettermi di fare il login nel sito originale ma non capisco bene come! Sfortunatamente quando provo di nuovo la funzione submit_form() con questo modulo, non sembra funzionare. Ho provato questo:

submit_form(mcsession, athensform) %>% html_form() %>% submit_form(mcsession, .) %>% html() 

E ottenuto questo:

Submitting with 'submit' 
Submitting with '' 
Error in if (!(submit %in% names(submits))) { : 
    argument is of length zero 
+0

Alcuni codice potrebbe aiutare. La domanda "come fare un grande esempio riproducibile" merita una lettura. –

+0

Avete provato a usare 'getURL()' dal pacchetto 'RCurl', q.v. [questo articolo SO] (http://stackoverflow.com/questions/15168970/log-into-a-website-to-grab-the-data-using-rcurl) –

+0

Le funzioni in 'rvest' e' httr' seguono i reindirizzamenti di default, quindi sarei curioso di sapere cosa c'è nella risposta che impedirebbe di farlo qui. Come ha detto @ user2633645, non abbiamo codice da esaminare. Un'altra alternativa è scrivere una sessione in RSelenium per acquisire gli stessi dati. – hrbrmstr

risposta

1

E 'molto probabile legato a this issue che impedisce httr di rilasciare il corretto GET query di reindirizzamento.

Tuttavia, è un po 'difficile da indovinare, perché manca un esempio riproducibile o l'output dettagliato completo della query.

Una soluzione è quella di evitare che il redirect con:

rvest::submit_form(..., 
        httr::config(followlocation = FALSE))