2010-08-06 67 views

回答

7

點擊下載鏈接上執行這段JavaScript代碼:

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

__doPostBack功能似乎只是在一對夫婦的網頁上隱藏的表單字段填寫然後提交一個POST請求。

一個快速的搜索結果顯示RCurl能夠提交POST請求。因此,您需要做的是查看該頁面的源代碼,找到名稱爲「aspnetForm」的表單,從該表單中獲取所有字段,並創建您自己的POST請求,將這些字段提交到操作URL(http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX )。

不能保證這將工作,但。似乎有一個隱藏的表單域名爲__VIEWSTATE,似乎編碼的一些信息,我不知道這個因素如何。

+0

很好 - 您在哪裏找到了關於如何使用RCurl提交Javascript POST請求的文檔? – 2010-08-06 19:11:05

+0

http://www.omegahat.org/RCurl/installed/RCurl/html/postForm.html – Jeff 2010-08-06 19:27:21

1

這絕對是在RCurl中獲得.csv文件的方式,但我可以'弄清楚我想在getForm中使用哪些表單域來使其工作。我應該使用附加到頁面上「下載」鏈接的doPostBack命令中的字段,還是應該在源頁面上使用aspnetForm中的字段。僅供參考,我們感興趣的aspnetForm字段是:

「 form name =」aspnetForm「method =」post「action =」holdings.aspx?ticker = PGX「id =」aspnetForm「style =」保證金:0像素 「 」

...和postForm請求,我只是想,沒有工作是

postForm(「 http://www.invescopowershares.com/products/holdings.aspx?ticker=PGX」, 「表單名稱」= 「aspnetForm」, 「方法」=「發表評論發表評論您還沒有登錄,無法進行此操作,請重試。

+0

您將從aspnetForm表單中的字段開始,然後用doPostBack函數插入的值覆蓋那裏的內容隱藏的領域。因爲doPostBack所做的基本上是採用現有的表單並填寫兩個隱藏的字段,然後提交表單。 – Jeff 2010-08-06 20:33:41

10

我會給你一個快速和骯髒的方式來獲取數據。首先,您可以使用Fiddler2 http://www.fiddler2.com/fiddler2/來檢查您的瀏覽器發送的POST。這將導致下面的帖子:

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也許總是相同的,或者它們可能會話cookie。你可能可以使用RCurl來獲取它們,但正如我所說這是一個快速和骯髒的解決方案,我們只是採用Internet Explorer所提供的解決方案。注意事項:

1)。這需要安裝IE的窗口才能使用rcom位。 2)。如果您正在運行ie9,則可能需要將invescopowershares.com添加到兼容性視圖設置(因爲Microsoft似乎已阻止event.val < -myPW [[「dumVar1」]] com com calls)

編輯(更新)

通過更詳細地查看網站__EVENTVALIDATION,__VIEWSTATE被設置爲初始頁面上的JavaScript變量。我們可以按照下面的方式快速,骯髒地解析這些內容,而不必通過調用瀏覽器。

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

Bravo!好樣的!非常感謝你! – GSee 2012-06-12 22:37:08

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是裏面的第一個字符串javascript:__ doPostBack() 函數,當您右鍵單擊「下載」鏈接和「複製鏈接地址」時,您將獲得該函數。

action是動作url的產品特定部分。

在內部,代碼如下在他 answerJeff's建議和搜索頁面的源代碼的值爲「aspnetForm」字段 。然後,它在到postForm 呼叫使用這些值(從RCurl包。)

qmao packagedlPowerShares是通過使用getHoldings.powershares 。另外,getHoldings將調用getHoldings.powershares 如果其中一個Symbols傳遞給它是PowerShares ETF的象徵。


p.s.如果qmao:::dlPowerShares被默認值調用,它將從 下載PowerShares產品列表