2015-04-16 3 views
0

У меня есть следующий код, который я заимствовал из предыдущего обсуждения Stackoverflow (Extracting data from javascript with R). Я басистски пытаюсь получить некоторые данные для некоторых фармацевтических препаратов. Когда я запускаю код для одного фармацевтического кода (2203), он работает просто отлично!R RSelenium и фантом в петле

appURL <- "http://web.sivicos.gov.co:8080/consultas/consultas/consreg_encabcum.jsp" 
library(RSelenium) 
pJS <- phantom(extras = c('--ssl-protocol=tlsv1')) 
Sys.sleep(5) # give the binary a moment 
remDr <- remoteDriver(browserName = "phantom") 
remDr$open() 
Sys.sleep(1) # give the binary a moment 
remDr$navigate(appURL) 
# Get the third list item of the select box (MEDICAMENTOS) 
webElem <- remDr$findElement("css", "select[name='grupo'] option:nth-child(3)") 
webElem$clickElement() # select this element 
# Send text to input value="" name="expediente 
webElem <- remDr$findElement("css", "input[name='expediente']") 
webElem$sendKeysToElement(list(2203)) 
# Click the Buscar button 
remDr$findElement("id", "INPUT2")$clickElement() 
Sys.sleep(3) # give the binary a moment 
remDr$switchToFrame(remDr$findElement("css", "iframe[name='datos']")) 
remDr$findElement("css", "a")$clickElement() # click the link given in the iframe 

# get the resulting data 

appData <- remDr$getPageSource()[[1]] 
# close phantom js 
pJS$stop() 

Но когда я положил его в петлю, так что я могу получить информацию для всех фармацевтических препаратов, мне нужно ... он сломается. Ниже приведен код внутри цикла.

for(cum in 2203){ 
appURL <- "http://web.sivicos.gov.co:8080/consultas/consultas/consreg_encabcum.jsp" 
library(RSelenium) 
pJS <- phantom(extras = c('--ssl-protocol=tlsv1')) 
Sys.sleep(5) # give the binary a moment 
remDr <- remoteDriver(browserName = "phantom") 
remDr$open() 
Sys.sleep(1) # give the binary a moment 
remDr$navigate(appURL) 
# Get the third list item of the select box (MEDICAMENTOS) 
webElem <- remDr$findElement("css", "select[name='grupo'] option:nth-child(3)") 
webElem$clickElement() # select this element 
# Send text to input value="" name="expediente 
webElem <- remDr$findElement("css", "input[name='expediente']") 
webElem$sendKeysToElement(list(cum)) 
# Click the Buscar button 
remDr$findElement("id", "INPUT2")$clickElement() 
Sys.sleep(3) # give the binary a moment 
remDr$switchToFrame(remDr$findElement("css", "iframe[name='datos']")) 
remDr$findElement("css", "a")$clickElement() # click the link given in the iframe 

# get the resulting data 

appData <- remDr$getPageSource()[[1]] 
# close phantom js 
pJS$stop() 
readHTMLTable(appData, which = 3) 

} 

Любые идеи о том, что происходит? Я попытался дать фантомное время, чтобы сделать что-то, поскольку я слышал, что это может быть проблемой, но это не сработало. Она не работает с одним кодом 2203 или с двумя с (2202,2203)

ответ

0

Кажется, сайт сейчас тестирует на UserAgent:

appURL <- "http://web.sivicos.gov.co:8080/consultas/consultas/consreg_encabcum.jsp" 
library(RSelenium) 
pJS <- phantom(extras = c('--ssl-protocol=tlsv1')) 
Sys.sleep(5) # give the binary a moment 
for(cum in "2203"){ 
    eCap <- list(phantomjs.page.settings.userAgent 
       = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20120101 Firefox/29.0") 
    remDr <- remoteDriver(browserName = "phantomjs", extraCapabilities = eCap) 
    remDr$open() 
    Sys.sleep(1) # give the binary a moment 
    remDr$navigate(appURL) 
    # Get the third list item of the select box (MEDICAMENTOS) 
    webElem <- remDr$findElement("css", "select[name='grupo'] option:nth-child(3)") 
    webElem$clickElement() # select this element 
    # Send text to input value="" name="expediente 
    webElem <- remDr$findElement("css", "input[name='expediente']") 
    webElem$sendKeysToElement(list(cum)) 
    # Click the Buscar button 
    remDr$findElement("id", "INPUT2")$clickElement() 
    Sys.sleep(3) # give the binary a moment 
    remDr$phantomExecute("var page = this; 
        page.switchToFrame('datos'); 
        page.evaluate(function() { 
        document.querySelector('a').click(); 
        }); 
    ") 

    # get the resulting data 
    Sys.sleep(3) # give the binary a moment 

    appData <- remDr$getPageSource()[[1]] 
    # close phantom js 
    readHTMLTable(appData, which = 3) 
    remDr$close() 
} 
pJS$stop() 
+0

спасибо за создание пакета ... Это было спасатель! Я буквально скопировал и вставил ваш код, но он не работает. Я не уверен, что это потому, что мне нужно настроить useragent на что-то конкретное ... Я слушаю ваш веб-семинар http://cran.r-project.org/web/packages/RSelenium/vignettes/OCRUG-webinar .html прямо сейчас, и, надеюсь, я мог бы узнать кое-что, что мне не хватает. –

+0

@MauricioRomero появляются проблемы с phantomjs2 и webdriver, исполняющие javascript в iframe. Я работал с использованием 'phantomExecute'. Однако на данный момент phantomJS2 выглядит слегка искаженным в режиме webdriver. Вы можете вернуться к фантому 1.98 или использовать другой браузер (chrome/firefox). – jdharrison

Смежные вопросы