Cómo iniciar sesión y luego descargar un archivo de páginas web aspx con R

Estoy tratando de automatizar la descarga de los archivos de Panel Study of Income Dynamics disponibles en esta página web usando R. Al hacer clic en cualquiera de esos archivos, el usuario accede a esta página de inicio de sesión / autenticación . Después de la autenticación, es fácil descargar los archivos con su navegador web. Desafortunadamente, el código httr continuación no parece mantener la autenticación. He intentado inspeccionar Headers in Chrome para la página Login.aspx ( como se describe aquí ), pero no parece mantener la autenticación incluso cuando creo que estoy pasando todos los valores correctos. No me importa si está hecho con httr o RCurl o algo más, me gustaría algo que funcione dentro de R, así que no necesito que los usuarios de este script tengan que descargar los archivos manualmente o con un progtwig completamente separado . Uno de mis bashs es el siguiente, pero no funciona. Cualquier ayuda sería apreciada. ¡¡Gracias!! :RE

 require(httr) values <- list( "ctl00$ContentPlaceHolder3$Login1$UserName" = "you@email.com" , "ctl00$ContentPlaceHolder3$Login1$Password" = "somepassword" , "ctl00$ContentPlaceHolder3$Login1$LoginButton" = "Log In" , "_LASTFOCUS" = "" , "_EVENTTARGET" = "" , "_EVENTARGUMENT" = "" ) POST( "http://simba.isr.umich.edu/u/Login.aspx?redir=http%3a%2f%2fsimba.isr.umich.edu%2fZips%2fZipMain.aspx" , body = values ) resp <- GET( "http://simba.isr.umich.edu/Zips/GetFile.aspx" , query = list( file = "1053" ) ) 

Además de almacenar la cookie después de la autenticación (ver mi comentario anterior), había otro punto problemático en su solución: el sitio ASP.net establece un par de clave-valor VIEWSTATE en la cookie que se reservará en sus consultas; si lo hace, usted ni siquiera podía iniciar sesión en su ejemplo (el resultado del comando POST contiene información sobre cómo iniciar sesión, simplemente compruébelo).

Un resumen de una posible solución:

  1. Cargar el paquete RCurl :

     > library(RCurl) 
  2. Configura algunas opciones prácticas de curl :

     > curl = getCurlHandle() > curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = curl) 
  3. Cargue la página por primera vez para capturar VIEWSTATE :

     > html <- getURL('http://simba.isr.umich.edu/u/Login.aspx', curl = curl) 
  4. Extraiga VIEWSTATE con una expresión regular o cualquier otra herramienta:

     > viewstate <- as.character(sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html)) 
  5. Establezca los parámetros como su nombre de usuario, contraseña y VIEWSTATE :

     > params <- list( 'ctl00$ContentPlaceHolder3$Login1$UserName' = '', 'ctl00$ContentPlaceHolder3$Login1$Password' = '', 'ctl00$ContentPlaceHolder3$Login1$LoginButton' = 'Log In', '__VIEWSTATE' = viewstate ) 
  6. Inicia sesión por fin:

     > html = postForm('http://simba.isr.umich.edu/u/Login.aspx', .params = params, curl = curl) 

    ¡Felicitaciones, ahora has iniciado sesión y curl tiene la cookie que verifica eso!

  7. Verifique si ha iniciado sesión:

     > grepl('Logout', html) [1] TRUE 
  8. De modo que puede continuar y descargar cualquier archivo; solo asegúrese de pasar curl = curl en todas sus consultas.