Использование rvest или httr для входа в нестандартные формы на веб-странице

Я пытаюсь использовать rvest для сканирования веб-страницы, для которой требуется ввести адрес электронной почты / пароль для входа в форму.

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

Это дает мне следующее сообщение об ошибке:

Error in submit_request(form, submit) : 

объект 'ctl00 $ Header2 $ HeaderTop1 $ Button1' не найден

Если я отправлю форму без указания параметра отправки, я получу следующее:

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

Я также попытался передать параметры напрямую в httr, как указано в этом вопросе: Как я могу отправить простую HTML-форму в R?, но параметр" submit "не принимал кнопку отправки ни с обратными кавычками (` `), ни с кавычками, ни без кавычек:

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) 

Есть идеи, как я могу войти в систему из сеанса R и обработать данные, которые находятся за стеной входа?


person gbostock    schedule 09.02.2015    source источник


Ответы (1)


Ваш rvest код не сохраняет измененную форму, поэтому в вашем примере вы просто отправляете исходный pgform без заполнения значений. Пытаться:

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)

И теперь я вижу хороший ответ с кодом состояния 200 вместо ошибки. Обратите внимание: поскольку желаемая кнопка отправки выглядит как первая кнопка отправки, нам не нужно указывать ее в качестве аргумента, но в противном случае мы просто дали бы ей строку (прямые кавычки, а не обратные кавычки).

person cboettig    schedule 24.03.2015
comment
Привет, большое спасибо за ваш ответ - теперь из вашего решения я понимаю, что вам нужно сохранить заполненную форму как объект в R, а не просто передавать ее в сеанс. Однако я не могу воспроизвести ваш код состояния 200 - я запускаю приведенный выше код и получаю ту же ошибку, указанную выше "Submitting with 'ctl00$Header2$HeaderTop1$Button1' Error in function (type, msg, asError = TRUE) : <url> malformed" Есть идеи, в чем может быть разница? - person gbostock; 25.03.2015
comment
РЕДАКТИРОВАТЬ: я загрузил последнюю версию R (3.1.3) и получил то же сообщение. Спасибо! Я посмотрю и доложу. - person gbostock; 25.03.2015
comment
Отличный ответ! Как бы вы переместились в этом сеансе с rvest? - person Carol.Kar; 29.12.2015