2013-04-06 59 views
13

Tôi đang cố gắng tự động tải xuống các Nghiên cứu về Thu nhập Động lực Bảng điều khiển có sẵn trên this web page bằng cách sử dụng R. Nhấp vào bất kỳ tệp nào trong số đó đến số this login/authentication page. Sau khi xác thực, thật dễ dàng để tải xuống các tệp bằng trình duyệt web của bạn. Thật không may, mã số httr bên dưới dường như không duy trì xác thực. Tôi đã thử kiểm tra Headers trong Chrome cho trang Login.aspx (as described here), nhưng dường như không duy trì xác thực ngay cả khi tôi tin rằng tôi đang chuyển tất cả các giá trị chính xác. Tôi không quan tâm nếu nó được thực hiện với httr hoặc RCurl hoặc cái gì khác, tôi chỉ muốn một cái gì đó hoạt động bên trong R vì vậy tôi không cần phải có người dùng của tập lệnh này phải tải xuống các tệp theo cách thủ công hoặc với một số chương trình hoàn toàn riêng biệt . Một trong những nỗ lực của tôi ở đây là dưới đây, nhưng nó không hoạt động. Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn!! : DCách đăng nhập và sau đó tải xuống tệp từ các trang web aspx có 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

Bạn phải lưu cookie sau khi xác thực và vượt qua điều đó với mọi cuộc gọi khác - xem ví dụ:http://stackoverflow.com/a/15451157/564164 – daroczig

+0

@daroczig cảm ơn .. tôi thực sự đã cố gắng sao chép một ngày hôm qua, nó không hoạt động. :(có thể bất cứ điều gì khác đang xảy ra? –

Trả lời

9

Bên cạnh việc lưu trữ các tập tin cookie sau khi xác thực (xem bình luận trên của tôi) đã có một điểm vấn đề trong giải pháp của bạn: trang web ASP.net đặt một cặp VIEWSTATE giá trị khóa trong cookie mà là để dành trong các truy vấn của bạn - nếu bạn kiểm tra, thậm chí bạn không thể đăng nhập trong ví dụ của mình (kết quả của lệnh POST lưu giữ thông tin về cách đăng nhập, chỉ cần kiểm tra nó).

Một phác thảo của một giải pháp khả thi:

  1. tải RCurl gói:

    > library(RCurl) 
    
  2. Đặt một số tiện dụng curl lựa chọn:

    > curl = getCurlHandle() 
    > curlSetOpt(cookiejar = 'cookies.txt', followlocation = TRUE, autoreferer = TRUE, curl = curl) 
    
  3. Nạp pag e lần đầu tiên để nắm bắt VIEWSTATE:

    > html <- getURL('http://simba.isr.umich.edu/u/Login.aspx', curl = curl) 
    
  4. Extract VIEWSTATE với một biểu thức chính quy hoặc bất kỳ công cụ khác:

    > viewstate <- as.character(sub('.*id="__VIEWSTATE" value="([0-9a-zA-Z+/=]*).*', '\\1', html)) 
    
  5. Đặt các thông số như tên người dùng, mật khẩu VIEWSTATE:

    > params <- list(
        'ctl00$ContentPlaceHolder3$Login1$UserName' = '<USERNAME>', 
        'ctl00$ContentPlaceHolder3$Login1$Password' = '<PASSWORD>', 
        'ctl00$ContentPlaceHolder3$Login1$LoginButton' = 'Log In', 
        '__VIEWSTATE'         = viewstate 
        ) 
    
  6. Đăng nhập lúc mới nhất:

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

    Xin chúc mừng, bây giờ bạn đã đăng nhập và curl giữ cookie xác minh điều đó!

  7. Xác nhận nếu bạn đã đăng nhập:

    > grepl('Logout', html) 
    [1] TRUE 
    
  8. Vì vậy, bạn có thể đi trước và tải về bất kỳ tập tin - chỉ cần chắc chắn để vượt qua curl = curl trong tất cả các truy vấn của bạn.

+2

có !!!!!!! mà làm việc cảm ơn bạn !! :) đây là hai dòng cuối cùng để có được những gì tôi muốn: 'tập tin <- getBinaryURL (" http: // simba.isr.umich.edu/Zips/GetFile.aspx?file=1053 ", curl = curl)' và 'writeBin (tệp," c: /temp/thefile.zip ")' –

+0

Tuyệt vời, tôi rất vui vì tôi có thể giúp. – daroczig

+0

@daroczig Tôi có một truy vấn tương tự với một trang .NET khác nhau. Vui lòng cho tôi biết nếu bạn muốn tôi mở một chuỗi mới. –

Các vấn đề liên quan