2010-08-06 16 views
6

मैं किसी वेबसाइट से डेटा को आजमाने और डाउनलोड करने के लिए आर में RCurl का उपयोग कर रहा हूं, लेकिन मुझे यह पता लगाने में समस्या हो रही है कि कौन सी यूआरएल उपयोग करें।जावास्क्रिप्ट लिंक का वेब पता ढूंढना

http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX

कैसे देखें सबसे ऊपर दाईं ओर प्रदर्शित चादर से ऊपर, वहाँ एक .csv फ़ाइल के रूप में डेटा डाउनलोड करने के लिए एक लिंक भी है: यहाँ साइट है? मैं सोच रहा था कि .csv फ़ाइल के लिए नियमित HTTP पता खोजने का कोई तरीका था, क्योंकि RCurl जावास्क्रिप्ट आदेशों को संभाल नहीं सकता है।

उत्तर

7

पर डाउनलोड लिंक पर क्लिक करने के लिए जावास्क्रिप्ट के इस टुकड़े को निष्पादित करता है: __doPostBack समारोह बस उस पृष्ठ पर छिपे हुए प्रपत्र फ़ील्ड्स के एक जोड़े को भरने के लिए प्रकट होता है

__doPostBack('ctl00$MainPageLeft$MainPageContent$ExportHoldings1$LinkButton1','') 

यही तो एक पोस्ट अनुरोध सबमिट करें।

एक त्वरित googling से पता चलता है कि आरसीआरएल एक POST अनुरोध जमा करने में सक्षम है। तो, आपको उस पृष्ठ के स्रोत में क्या देखना होगा, उस नाम को "aspnetForm" नाम से ढूंढें, उस फॉर्म से सभी फ़ील्ड लें, और अपना स्वयं का POST अनुरोध बनाएं जो फ़ील्ड को क्रिया URL (http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX पर सबमिट करता है))।

यह गारंटी नहीं दे सकता कि यह काम करेगा, हालांकि। __VIEWSTATE नामक एक छिपी हुई फार्म फ़ील्ड प्रतीत होती है जो कुछ जानकारी को एन्कोड करने के लिए प्रतीत होता है, और मुझे नहीं पता कि यह कारक कैसे हैं।

+0

Great-- से Powershares उत्पाद सूची जहां आप कैसे जावास्क्रिप्ट RCurl प्रयोग करने के लिए एक पोस्ट अनुरोध जमा करने के तरीके प्रलेखन मिला डाउनलोड करेगा? –

+0

http://www.omegahat.org/RCurl/installed/RCurl/html/postForm.html – Jeff

1

यह निश्चित रूप से आरसीआरएल में .csv फ़ाइल प्राप्त करने का तरीका है, लेकिन मैं ' यह समझने के लिए getForm में किस फॉर्म फ़ील्ड का उपयोग करना चाहते हैं, यह समझें। क्या मुझे पृष्ठ पर "डाउनलोड" लिंक से जुड़ा हुआ doPostBack कमांड से फ़ील्ड का उपयोग करना चाहिए, या क्या मुझे स्रोत पृष्ठ पर aspnetForm से फ़ील्ड्स का उपयोग करना चाहिए। बस संदर्भ के लिए, एस्पनेटफॉर्म फ़ील्ड जिसमें हम रुचि रखते हैं:

" फ़ॉर्म नाम =" aspnetForm "विधि =" पोस्ट "एक्शन =" होल्डिंग्स.एक्सएक्स? टिकर = पीजीएक्स "आईडी =" एस्पेनेटफॉर्म "शैली =" मार्जिन: 0px " "

... और postForm अनुरोध मैं बस की कोशिश की है कि किया था काम नहीं था

postForm ("http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX", "प्रपत्र नाम" = "aspnetForm" "विधि" = " पोस्ट "," एक्शन "=" होल्डिंग्स.एएसपीएक्स? टिकर = पीजीएक्स "," आईडी "=" एस्पनेटफॉर्म "," स्टाइल "=" मार्जिन: 0 पीएक्स ")

सभी मदद के लिए धन्यवाद!

+0

आप एस्पनेटफॉर्म फॉर्म में फ़ील्ड्स से शुरू करेंगे, फिर उन मूल्यों के साथ जो कुछ भी है उसमें ओवरराइड करें जो DoPostBack फ़ंक्शन में प्रवेश करता है छुपे हुए खेतोंचूंकि पोस्टबैक क्या करता है मूल रूप से मौजूदा रूप लेता है और दो छिपे हुए फ़ील्ड में भर जाता है, फिर फॉर्म जमा करें। – Jeff

10

मैं आपको डेटा प्राप्त करने के लिए एक त्वरित और गंदा तरीका दूंगा। सबसे पहले आप अपने ब्राउज़र द्वारा पोस्ट किए गए पोस्ट का निरीक्षण करने के लिए फिडलर 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') 

उपरोक्त को क्रॉस प्लेटफ़ॉर्म का काम करना चाहिए।

+0

ब्रावो! वाहवाही! आपका बहुत बहुत धन्यवाद! – GSee

1

अब qmao package में एक फ़ंक्शन है जो आपके लिए यह करेगा। (यह इस सवाल का एक अब नष्ट कर दिया जवाब से कोड पर आधारित है।)

आप dlPowerShares समारोह इस तरह उपयोग कर सकते हैं:

require("qmao") 
Symbol <- "PGX" 
dat <- qmao:::dlPowerShares(event.target = "ctl00$MainPageLeft$MainPageContent$ExportHoldings1$LinkButton1", 
          action = paste0("holdings.aspx?ticker=", Symbol)) 
> head(dat) 
    ticker SecurityNum       Name CouponRate maturitydate rating Shares PercentageOfFund PositionDate 
1 PGX 173080201   CITIGROUP CAPITAL XIII 0.07875 10/30/2040 BB/Ba2 2998647  0.04274939 08/31/2012 
2 PGX 949746879  WELLS FARGO & COMPANY PFD 0.08000    BBB+/Baa3 2549992  0.03935854 08/31/2012 
3 PGX 06739H362  BARCLAYS BK PLC    0.08125    A-/Baa3 2757635  0.03644835 08/31/2012 
4 PGX 46625H621  JPMORGAN CHASE    0.08625    BBB+/Baa1 2416021  0.03310707 08/31/2012 
5 PGX 060505765 BANK OF AMERICA CORP PFD 8.2 0.08200     BB+/B1 2345508  0.03128002 08/31/2012 
6 PGX 060505559 BANC OF AMERICA CORP PFD 8.625 0.08625     BB+/B1 2259484  0.03001599 08/31/2012 

उपरोक्त कोड में, event.target पहली स्ट्रिंग के अंदर है जावास्क्रिप्ट: __ doPostBack() फ़ंक्शन जो आपको "डाउनलोड" लिंक पर राइट क्लिक करें और "लिंक पता कॉपी करें" पर क्लिक करेगा।

action एक्शन यूआरएल का उत्पाद-विशिष्ट हिस्सा है।

आंतरिक रूप से, कोड अपने answer में Jeff's सुझाव इस प्रकार है और मूल्यों "aspnetForm" के लिए खेतों की के लिए पृष्ठ के स्रोत खोज करता है। यह तो postForm के लिए एक कॉल में उन मूल्यों का उपयोग करता है (RCurl पैकेज से।)

qmao package में, dlPowerShares getHoldings.powershares द्वारा प्रयोग किया जाता है। इसके अलावा, getHoldings.powershares पर कॉल करेगा यदि Symbols में से एक इसे पावरशेयर ईटीएफ का प्रतीक है।


पेज। यदि qmao:::dlPowerShares अपनी चूक के साथ कहा जाता है, यह http://www.invescopowershares.com/products/

संबंधित मुद्दे