Подтвердить что ты не робот

Как войти, а затем загрузить файл с веб-страниц aspx с помощью R

Я пытаюсь автоматизировать загрузку панельных исследований по динамике доходов, доступных на этой веб-странице, используя R. Нажав на любую из этих файлов пользователь переходит к этой странице входа/аутентификации. После аутентификации легко загружать файлы с помощью веб-браузера. К сожалению, приведенный ниже код httr не поддерживает аутентификацию. Я попытался проверить Headers в Chrome на странице Login.aspx(как описано здесь), но он, похоже, не поддерживает аутентификацию, даже если я верю Я передаю все правильные значения. Мне все равно, было ли это с помощью httr или RCurl или что-то еще, мне просто хотелось бы что-то, что работает внутри R, поэтому мне не нужно, чтобы пользователи этого script загружали файлы вручную или с некоторой полностью отдельной программой. Одна из моих попыток - ниже, но это не сработает. Любая помощь будет оценена по достоинству. Благодарю!!: D

require(httr)

values <- 
    list( 
        "ctl00$ContentPlaceHolder3$Login1$UserName" = "[email protected]" , 
        "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" ) )
4b9b3361

Ответ 1

Помимо сохранения cookie после проверки подлинности (см. мой комментарий выше), в вашем решении возникла еще одна проблемная точка: сайт ASP.net устанавливает пару ключ-значение VIEWSTATE в cookie, который должен быть зарезервирован в ваших запросах - если вы проверите, вы не сможете даже войти в свой пример (результат команды POST содержит информацию о том, как войти в систему, просто проверьте его).

Схема возможного решения:

  • Загрузите пакет RCurl:

    > library(RCurl)
    
  • Установите несколько удобных опций curl:

    > curl = getCurlHandle()
    > curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = curl)
    
  • Загрузите страницу в первый раз, чтобы захватить VIEWSTATE:

    > html <- getURL('http://simba.isr.umich.edu/u/Login.aspx', curl = curl)
    
  • Извлеките VIEWSTATE с помощью регулярного выражения или любого другого инструмента:

    > viewstate <- as.character(sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html))
    
  • Задайте параметры как имя пользователя, пароль и VIEWSTATE:

    > params <- list(
        'ctl00$ContentPlaceHolder3$Login1$UserName'    = '<USERNAME>',
        'ctl00$ContentPlaceHolder3$Login1$Password'    = '<PASSWORD>',
        'ctl00$ContentPlaceHolder3$Login1$LoginButton' = 'Log In',
        '__VIEWSTATE'                                  = viewstate
        )
    
  • Войдите в систему:

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

    Поздравляем, теперь вы вошли в систему и curl хранит файл cookie, подтверждающий это!

  • Убедитесь, что вы вошли в систему:

    > grepl('Logout', html)
    [1] TRUE
    
  • Итак, вы можете продолжить и загрузить любой файл - просто обязательно передайте curl = curl во все ваши запросы.