html - scraping - rvest r
Uso de rvest o httr para iniciar sesión en formularios no estándar en una página web (1)
Estoy intentando usar rvest para arañar una página web que requiere un inicio de sesión de correo electrónico / contraseña en un formulario.
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`)
Esto me da el siguiente mensaje de error:
Error in submit_request(form, submit) :
objeto ''ctl00 $ Header2 $ HeaderTop1 $ Button1'' no encontrado
Si envío el formulario sin especificar el parámetro de envío, obtengo esto:
Submitting with ''ctl00$Header2$HeaderTop1$Button1''
Error in function (type, msg, asError = TRUE) : <url> malformed
También intenté pasar los parámetros directamente a httr como se mencionó en esta pregunta: ¿Cómo puedo POSTAR un formulario HTML simple en R? , pero el parámetro "enviar" no aceptó el botón de envío con comillas al revés (``), comillas o sin comillas:
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)
¿Alguna idea de cómo puedo iniciar sesión desde una sesión R y arañar los datos que están detrás del muro de inicio de sesión?
Su código de rvest
no almacena el formulario modificado, por lo que en el ejemplo solo está enviando el pgform
original sin que se pgform
los valores. Tratar:
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)
Y ahora veo una buena respuesta de código de estado 200 en lugar de un error. Tenga en cuenta que debido a que el botón de envío deseado parece ser el primer botón de envío, no necesitamos darlo como un argumento, pero de lo contrario solo le estaríamos asignando una cadena (comillas rectas, no comillas atrás).