Tôi sẽ cung cấp cho bạn cách nhanh chóng và bẩn để lấy dữ liệu. Trước tiên, bạn có thể sử dụng Fiddler2 http://www.fiddler2.com/fiddler2/ để kiểm tra POST mà trình duyệt của bạn gửi. Điều này dẫn đến POST sau:
POST http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX HTTP/1.1
Host: www.invescopowershares.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
DNT: 1
Connection: keep-alive
Referer: http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX
Content-Type: application/x-www-form-urlencoded
Content-Length: 70669
__EVENTTARGET=ctl00%24MainPageLeft%24MainPageContent%24ExportHoldings1%24LinkButton1&__EVENTARGUMENT=&__VIEWSTATE=%2FwEPDwUKLTE1OTcxNjYzNw9kFgJmD2QWBAIDD2QWBAIDD2QWCAIBDw9kFgQeC2........
Vì vậy, chúng ta có thể thấy 3 thông số đang được đăng là __EVENTTARGET, __EVENTVALIDATION và __VIEWSTATE.
Hình thức cần thiết cho cuộc gọi postForm sẽ là:
postForm(ftarget, "form name" = "aspnetForm", "method" = "POST", "action" = "holdings.aspx?ticker=PGX", "id" = "aspnetForm","__EVENTTARGET"=event.target,"__EVENTVALIDATION"=event.val,"__VIEWSTATE"=view.state)
Bây giờ đến các bit nhanh chóng và dơ bẩn.Tôi sẽ chỉ cần mở trình duyệt và nhận các thông số có liên quan mà nó nhận được như sau:
library(rcom)
ie = comCreateObject('InternetExplorer.Application')
ie[["visible"]]=T # true for debugging
ie$Navigate2("http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX")
while(comGetProperty(ie,"busy")||comGetProperty(ie,"ReadyState")<4){
Sys.sleep(1)
print(comGetProperty(ie,"ReadyState"))
}
myDoc<-comGetProperty(ie,"Document")
myPW<-comGetProperty(myDoc,"parentWindow")
comInvoke(myPW,"execScript","var dumVar1=theForm.__EVENTVALIDATION.value;var dumVar2=theForm.__VIEWSTATE.value;","JavaScript")
event.val<-myPW[["dumVar1"]]
view.state<-myPW[["dumVar2"]]
event.target<-"ctl00$MainPageLeft$MainPageContent$ExportHoldings1$LinkButton1"
ie$Quit()
ftarget<-"http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX"
web.data<-postForm(ftarget, "form name" = "aspnetForm", "method" = "POST", "action" = "holdings.aspx?ticker=PGX", "id" = "aspnetForm","__EVENTTARGET"=event.target,"__EVENTVALIDATION"=event.val,"__VIEWSTATE"=view.state)
write(web.data[1],'temp.csv')
fin.data<-read.csv('temp.csv')
> fin.data[1,]
ticker SecurityNum Name CouponRate maturitydate
1 PGX 949746879 WELLS FARGO & COMPANY PFD 0.08
rating Shares PercentageOfFund PositionDate
1 BBB+/Baa3 2538656 0.04442112 06/11/2012
__EVENTVALIDATION, __VIEWSTATE có lẽ là luôn luôn giống nhau hoặc họ có lẽ cookie phiên. Bạn có thể có thể nhận được chúng bằng cách sử dụng RCurl nhưng như tôi nói đây là giải pháp nhanh chóng và bẩn và chúng tôi chỉ cần lấy những người mà Internet Explorer được đưa ra. Những điều cần lưu ý:
1). Điều này yêu cầu các cửa sổ có cài đặt IE để sử dụng các bit rcom.
2). Nếu bạn đang chạy ie9, bạn có thể cần phải thêm invescopowershares.com vào Cài đặt Chế độ xem Tương thích (vì microsoft dường như đã chặn sự kiện.val < -myPW [["dumVar1"]] nhập cuộc gọi com)
EDIT (CẬP NHẬT)
Sau khi xem xét trang web chi tiết hơn __EVENTVALIDATION, __VIEWSTATE đang được đặt làm biến javascript trên trang ban đầu. Chúng tôi chỉ có thể phân tích cú pháp này theo cách nhanh chóng và bẩn thỉu như sau mà không cần phải gọi đến trình duyệt.
dum<-getURL("http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX")
event.target<-"ctl00$MainPageLeft$MainPageContent$ExportHoldings1$LinkButton1"
event.val<-unlist(strsplit(dum,"__EVENTVALIDATION\" value=\""))[2]
event.val<-unlist(strsplit(event.val,"\" />\r\n\r\n<script"))[1]
view.state<-unlist(strsplit(dum,"id=\"__VIEWSTATE\" value=\""))[2]
view.state<-unlist(strsplit(view.state,"\" />\r\n\r\n\r\n<script"))[1]
ftarget<-"http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX"
web.data<-postForm(ftarget, "form name" = "aspnetForm", "method" = "POST", "action" = "holdings.aspx?ticker=PGX", "id" = "aspnetForm","__EVENTTARGET"=event.target,"__EVENTVALIDATION"=event.val,"__VIEWSTATE"=view.state)
write(web.data[1],'temp.csv')
fin.data<-read.csv('temp.csv')
Nền tảng trên nên hoạt động trên nền tảng.
Tuyệt vời-- bạn đã tìm tài liệu về cách gửi yêu cầu POST cho Javascript bằng RCurl ở đâu? –
http://www.omegahat.org/RCurl/installed/RCurl/html/postForm.html – Jeff