मैं आपको डेटा प्राप्त करने के लिए एक त्वरित और गंदा तरीका दूंगा। सबसे पहले आप अपने ब्राउज़र द्वारा पोस्ट किए गए पोस्ट का निरीक्षण करने के लिए फिडलर 2 http://www.fiddler2.com/fiddler2/ का उपयोग कर सकते हैं। यह निम्न पोस्ट में जो परिणाम:
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........
तो हम देख सकते हैं कि 3 मानकों अर्थात् तैनात किया जा रहा है __EVENTTARGET, __EVENTVALIDATION और __VIEWSTATE।
postForm कॉल के लिए आवश्यक प्रपत्र होगा:
postForm(ftarget, "form name" = "aspnetForm", "method" = "POST", "action" = "holdings.aspx?ticker=PGX", "id" = "aspnetForm","__EVENTTARGET"=event.target,"__EVENTVALIDATION"=event.val,"__VIEWSTATE"=view.state)
अब त्वरित और गंदी बिट आता है।मैं सिर्फ एक ब्राउज़र खोलें और प्रासंगिक पैरामीटर यह इस प्रकार प्राप्त करता है कि मिल जाएगा:
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 शायद हमेशा एक ही है या वे शायद सत्र कुकीज़ हो। आप शायद उन्हें आरसीआरएल का उपयोग कर सकते हैं लेकिन जैसा कि मैंने कहा है कि यह त्वरित और गंदा समाधान है और हम केवल उन लोगों को लेते हैं जिन्हें इंटरनेट एक्सप्लोरर दिया जाता है। नोट्स:
1)। इसके लिए आरईसी बिट्स का उपयोग करने के लिए आईई स्थापित विंडोज़ की आवश्यकता है।
2)। यदि आप IE9 चला रहे हैं तो आपको संगतता दृश्य सेटिंग्स में invescopowershares.com जोड़ने की आवश्यकता हो सकती है (जैसा कि माइक्रोसॉफ्ट ने ईवेंट को अवरोधित किया है .val < -myPW [["dumVar1"]] टाइप कॉम कॉल)
संपादित करें (अद्यतन)
वेबसाइट के माध्यम से अधिक विस्तार से देखा गया __EVENTVALIDATION, __VIEWSTATE प्रारंभिक पृष्ठ पर जावास्क्रिप्ट चर के रूप में सेट किया जा रहा है। ब्राउज़र को कॉल करने के बिना हम इन्हें तुरंत एक त्वरित और गंदे फैशन में पार्स कर सकते हैं।
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')
उपरोक्त को क्रॉस प्लेटफ़ॉर्म का काम करना चाहिए।
Great-- से Powershares उत्पाद सूची जहां आप कैसे जावास्क्रिप्ट RCurl प्रयोग करने के लिए एक पोस्ट अनुरोध जमा करने के तरीके प्रलेखन मिला डाउनलोड करेगा? –
http://www.omegahat.org/RCurl/installed/RCurl/html/postForm.html – Jeff