2013-04-06 132 views
13

我試圖自動下載小組研究的收入動態文件可用this web page使用R.單擊任何這些文件需要用戶通過到this login/authentication page。認證之後,使用您的網絡瀏覽器輕鬆下載文件。不幸的是,下面的代碼httr似乎並沒有維持認證。我曾嘗試在Chrome瀏覽器中檢查Headers Login.aspx頁面(as described here),但即使我相信我傳遞了所有正確的值,它也不會維護身份驗證。我不在乎它是否與httrRCurlRCurl或其他內容完成,我只是喜歡R內部工作,所以我不需要這個腳本的用戶必須手動下載文件或使用一些完全獨立的程序。我的一個嘗試是在下面,但它不起作用。任何幫助,將不勝感激。謝謝!! :d如何登錄,然後從aspx網頁下載文件與R

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

您必須在認證後保存cookie,並在每次進一步調用時都將其傳遞 - 請參閱http://stackoverflow.com/a/15451157/564164 – daroczig 2013-04-08 22:02:54

+0

@daroczig謝謝..我實際上試圖複製那一個昨天,它沒有工作。 :(可能還有其他的事情發生了嗎? – 2013-04-09 01:21:07

回答

9

除了存儲認證後的cookie(見我的上述評論)出現在你的解決方案的另一個問題點:在ASP.net網站設置中要保留的cookie中VIEWSTATE鍵值對在你的查詢中 - 如果你檢查,你甚至不能登錄你的例子(POST命令的結果保存有關如何登錄的信息,只需檢查它)。

一個可能的解決方案的概要:

  1. 負載RCurl包:

    > library(RCurl) 
    
  2. 設置一些方便curl選項:

    > curl = getCurlHandle() 
    > curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = curl) 
    
  3. 裝入PAG E對於第一次捕捉到VIEWSTATE

    > html <- getURL('http://simba.isr.umich.edu/u/Login.aspx', curl = curl) 
    
  4. 提取VIEWSTATE用正則表達式或任何其他工具:

    > viewstate <- as.character(sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html)) 
    
  5. 參數設置用戶名,密碼VIEWSTATE

    > params <- list(
        'ctl00$ContentPlaceHolder3$Login1$UserName' = '<USERNAME>', 
        'ctl00$ContentPlaceHolder3$Login1$Password' = '<PASSWORD>', 
        'ctl00$ContentPlaceHolder3$Login1$LoginButton' = 'Log In', 
        '__VIEWSTATE'         = viewstate 
        ) 
    
  6. 最後登錄:

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

    恭喜,你現在登錄並curl持有的cookie驗證!

  7. 驗證,如果你已經登錄:

    > grepl('Logout', html) 
    [1] TRUE 
    
  8. 所以,你可以繼續下載任何文件 - 只是一定要通過curl = curl在您所有的疑問。

+2

是的!!!!!!!工作。謝謝!! :)這裏有兩個最後的行來得到我想要的:'file < - getBinaryURL(「http:// simba.isr.umich.edu/Zips/GetFile.aspx?file=1053「,curl = curl)'和 'writeBin(file,」c:/temp/thefile.zip「)' – 2013-04-09 10:56:47

+0

很酷,我很高興我有幫助。 – daroczig 2013-04-09 11:05:06

+0

@daroczig我有一個類似的查詢與不同的.NET網站。請讓我知道你是否希望我打開一個新線程。 – 2017-07-28 11:55:53