Le daré una forma rápida y sucia de obtener los datos. En primer lugar, puede usar Fiddler2 http://www.fiddler2.com/fiddler2/ para inspeccionar la POST que envía su navegador. Esto se traduce en el siguiente 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........
Así podemos ver que 3 parámetros se están publicando a saber __EVENTTARGET, __EVENTVALIDATION y __VIEWSTATE.
la forma requerida para la llamada postForm sería:
postForm(ftarget, "form name" = "aspnetForm", "method" = "POST", "action" = "holdings.aspx?ticker=PGX", "id" = "aspnetForm","__EVENTTARGET"=event.target,"__EVENTVALIDATION"=event.val,"__VIEWSTATE"=view.state)
Ahora viene la parte rápida y sucia.Me acaba de abrir un navegador y obtener los parámetros relevantes que recieves de la siguiente manera:
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 tal vez sea siempre el mismo o tal vez las cookies de sesión. Probablemente puedas obtenerlos usando RCurl, pero como digo, esta es la solución rápida y sucia, y solo tomamos los que se le da a Internet Explorer. Cosas a tener en cuenta:
1). Esto requiere ventanas con IE instalado para usar los bits rcom.
2). Si está ejecutando ie9, puede necesitar agregar invescopowershares.com a la Configuración de vista de compatibilidad (ya que Microsoft parece haber bloqueado event.val < -myPW [["dumVar1"]] tipo com llamadas)
EDITAR (ACTUALIZAR)
Después de examinar el sitio web con más detalle __EVENTVALIDATION, __VIEWSTATE se configuran como variables de JavaScript en la página inicial. Podemos analizar estos de manera rápida y sucia de la siguiente manera sin recurrir a llamar a un navegador.
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')
Lo anterior debe funcionar multiplataforma.
Great-- ¿dónde encontrar la documentación sobre cómo presentar una solicitud POST para Javascript usando RCurl? –
http://www.omegahat.org/RCurl/installed/RCurl/html/postForm.html – Jeff