2015-02-09 16 views
18

Sto tentando di utilizzare rvest per raggrupare una pagina Web che richiede un accesso via email/password in un modulo.Utilizzo di rvest o httr per accedere a moduli non standard su una pagina Web

rm(list=ls()) 
library(rvest) 

### Trying to sign into a form using email/password 

url  <-"http://www.perfectgame.org/" ## page to spider 
pgsession <-html_session(url)    ## create session 
pgform <-html_form(pgsession)[[1]]  ## pull form from session 

set_values(pgform, `ctl00$Header2$HeaderTop1$tbUsername` = "[email protected]") 
set_values(pgform, `ctl00$Header2$HeaderTop1$tbPassword` = "mypassword") 

submit_form(pgsession,pgform,submit=`ctl00$Header2$HeaderTop1$Button1`) 

questo mi dà il seguente messaggio di errore:

Error in submit_request(form, submit) : 

oggetto 'ctl00 $ Header2 $ HeaderTop1 $ Button1' non trovato

Se inviare il modulo senza specificare il parametro presentare, ho get this:

Submitting with 'ctl00$Header2$HeaderTop1$Button1' 
Error in function (type, msg, asError = TRUE) : <url> malformed 

Ho anche provato a passare i parametri direttamente ad httr come accennato in questa domanda: How can I POST a simple HTML form in R?, ma il parametro "invia" non ha accettato il pulsante di invio o con all'indietro virgolette (``), virgolette o senza virgolette:

library(httr) 

url <- "http://www.perfectgame.org/Rankings/Players/Default.aspx?gyear=2015&num=500" 

fd <- list(
    submit = `ctl00$Header2$HeaderTop1$Button1`, 
    `ctl00$Header2$HeaderTop1$tbUsername` = "[email protected]", 
    `ctl00$Header2$HeaderTop1$tbPassword` = "mypassword") 

resp<-POST(url, body=fd, encode="form") 
content(resp) 

Tutte le idee per come posso il login da una sessione R e spider i dati che si trovano dietro il muro di login?

risposta

15

Il codice rvest non memorizza il modulo modificato, quindi nell'esempio si sta semplicemente inviando l'originale pgform senza che i valori siano stati compilati. Prova:

library(rvest) 

url  <-"http://www.perfectgame.org/" ## page to spider 
pgsession <-html_session(url)    ## create session 
pgform <-html_form(pgsession)[[1]]  ## pull form from session 

# Note the new variable assignment 

filled_form <- set_values(pgform, 
    `ctl00$Header2$HeaderTop1$tbUsername` = "[email protected]", 
    `ctl00$Header2$HeaderTop1$tbPassword` = "mypassword") 

submit_form(pgsession,filled_form) 

E ora vedo una bella risposta del codice di stato 200 invece di un errore. Tieni presente che poiché il pulsante di invio desiderato sembra essere il primo pulsante di invio, non è necessario fornirlo come argomento, ma altrimenti dovremmo semplicemente assegnargli una stringa (virgolette semplici, non virgolette posteriori).

+0

Ciao, grazie mille per la tua risposta - dalla tua soluzione, capisco ora che devi salvare il modulo riempito come un oggetto in R piuttosto che semplicemente passarlo alla sessione. Tuttavia, non riesco a replicare il tuo codice di stato 200 - Eseguo il codice sopra e ottengo lo stesso errore elencato sopra "" Invio con 'ctl00 $ Header2 $ HeaderTop1 $ Button1' Errore nella funzione (tipo, msg, asError = TRUE): malformato "' Qualche idea di quale potrebbe essere la differenza? – gbostock

+0

EDIT: ho caricato la versione più recente di R (3.1.3) e ho ricevuto lo stesso messaggio. Grazie! Darò un'occhiata e riferirò. – gbostock

+0

Questo ha funzionato perfettamente. Grazie ancora! – gbostock

Problemi correlati