Asp.net

如何使用 R 登錄然後從 aspx 網頁下載文件

  • April 9, 2013

我正在嘗試使用 R 自動下載此網頁上可用的收入動態面板研究文件。點擊這些文件中的任何一個都會將使用者帶到此登錄/身份驗證頁面。身份驗證後,您可以使用 Web 瀏覽器輕鬆下載文件。不幸的是,下面的程式碼似乎沒有維護身份驗證。我已經嘗試在 Chrome 中檢查 Login.aspx 頁面(如此處所述),但即使我相信我傳遞了所有正確的值,它似乎也無法維持身份驗證。我不在乎它是否完成了httr``Headers``httr``RCurl或者別的什麼,我只是喜歡在 R 中工作的東西,所以我不需要這個腳本的使用者必須手動或使用一些完全獨立的程序下載文件。我的嘗試之一如下,但它不起作用。任何幫助,將不勝感激。謝謝!!:D

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

除了在身份驗證後儲存 cookie(請參閱我上面的評論),您的解決方案中還有另一個問題點:ASP.net 站點VIEWSTATE在 cookie 中設置了一個鍵值對,該鍵值對將在您的查詢中保留 - 如果您檢查,您可以在您的範例中甚至沒有登錄(POST命令的結果包含有關如何登錄的資訊,只需檢查一下)。

可能解決方案的概述:

  1. 載入RCurl包:
> library(RCurl)
  1. 設置一些方便的curl選項:
> curl = getCurlHandle()
> curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = curl)
  1. 首次載入頁面以擷取VIEWSTATE
> html <- getURL('http://simba.isr.umich.edu/u/Login.aspx', curl = curl)
  1. VIEWSTATE使用正則表達式或任何其他工具提取:
> viewstate <- as.character(sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html))
  1. 將參數設置為您的使用者名、密碼VIEWSTATE
> params <- list(
   'ctl00$ContentPlaceHolder3$Login1$UserName'    = '<USERNAME>',
   'ctl00$ContentPlaceHolder3$Login1$Password'    = '<PASSWORD>',
   'ctl00$ContentPlaceHolder3$Login1$LoginButton' = 'Log In',
   '__VIEWSTATE'                                  = viewstate
   )
  1. 最後登錄:
> html = postForm('http://simba.isr.umich.edu/u/Login.aspx', .params = params, curl = curl)

恭喜,現在您已登錄並curl持有 cookie 來驗證! 7. 驗證您是否已登錄:

> grepl('Logout', html)
[1] TRUE
  1. 因此,您可以繼續下載任何文件 - 只需確保傳遞curl = curl您的所有查詢。

引用自:https://stackoverflow.com/questions/15853204