2015-02-09 12 views
18

Próbuję użyć rvest do spiderowania strony internetowej, która wymaga loginu e-mail/hasła w formularzu.Używanie rvest lub httr do logowania się do niestandardowych formularzy na stronie internetowej

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`) 

To daje mi się następujący komunikat o błędzie:

Error in submit_request(form, submit) : 

obiekt 'ctl00 $ Header2 $ HeaderTop1 $ Przycisk1' Nie znaleziono

Gdybym wysłać formularz bez określania parametru przedstawienia, ja uzyskać to:

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

Próbowałem również przekazywanie parametrów bezpośrednio do httr, jak wspomniano w tej kwestii: How can I POST a simple HTML form in R?, ale parametr „submit” nie akceptować przycisk Prześlij albo wstecznej cudzysłów (``), cudzysłów, albo bez żadnych cytatów:

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) 

Wszelkie pomysły jak mogę się zalogować z sesji R i pająka danych, które stoją za ścianą logowania?

Odpowiedz

15

Twój kod nie zapisuje zmodyfikowanego formularza, więc na przykład przesyłasz oryginał pgform bez wypełniania wartości. Wypróbuj:

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) 

Teraz widzę niezłą odpowiedź kodu statusu 200 zamiast błędu. Zauważ, że ponieważ pożądany przycisk przesyłania wydaje się być pierwszym przyciskiem przesyłania, nie musimy podawać go jako argumentu, ale w przeciwnym razie po prostu podamy mu ciąg znaków (proste cytaty, a nie cytaty z powrotem).

+0

Witam, bardzo dziękuję za odpowiedź - z Twojego rozwiązania, rozumiem teraz, że musisz zapisać wypełniony formularz jako obiekt w R, a nie tylko przekazać go do sesji. Jednak nie mogę powtórzyć twojego kodu statusu 200 - uruchamiam powyższy kod i pojawia się ten sam błąd wymieniony powyżej "Przesyłanie z" ctl00 $ Header2 $ HeaderTop1 $ Button1 ' Błąd w funkcji (typ, msg, asError = PRAWDA): źle sformułowany " Czy masz pojęcie, jaka może być różnica? – gbostock

+0

EDYCJA: Wgrałem do najnowszej wersji R (3.1.3) i otrzymałem tę samą wiadomość. Dzięki! Przyjrzę się i zgłoś ponownie. – gbostock

+0

To działało idealnie. Dzięki jeszcze raz! – gbostock

Powiązane problemy