A automação de tarefas é uma maneira simples de evitar trabalhos repetitivos, em especial, desejamos coletar dados de sites e por algum motivo, cada observação (ou grupo de observações) precisa ser "manualmente" solicitada.
Essa solicitação pode ser exigida por meio de captchas ou outro mecanismo, impedindo assim muitas consultas ao servidor alvo e garantindo estabilidade ao serviço.
Entretanto, algumas ferramentas auxiliam na construção de bots para a coleta dessas informações, processo esse conhecido como Web scraping. Dentre as ferramentas mais utilizadas, destaco o iMacro e rSelenium (baseado na solução Selenium).
Nesse post trabalharemos com o driver do navegador Chrome, para isso, o primeiro passo é obter esse driver:
#Limpa o workspace rm(list=ls()) #Define o Working Directory setwd("C:/Users/RSelenium") #Instalação do RSelenium library(RSelenium) #Confere se o RSelenium está instalado checkForServer() #Baixa o driver: http://chromedriver.storage.googleapis.com/index.html bool<-FALSE bool<-file.exists("chromedriver.exe") if(!bool) { #Baixa o arquivo zip down<-"http://chromedriver.storage.googleapis.com/2.13/chromedriver_win32.zip" download.file(down,paste(getwd(),"/chromedriver.zip",sep="")) #Extrai o arquivo unzip(paste(getwd(),"/chromedriver.zip",sep="")) #Deleta o arquivo file.remove((paste(getwd(),"/chromedriver.zip",sep=""))) }O código anterior obtêm o driver e armazena na pasta escolhida, em seguida, iniciamos o navegador:
#Inicia o servidor startServer(args = c(paste("-Dwebdriver.chrome.driver=",getwd(),"/chromedriver.exe -Dwebdriver.chrome.args='--disable-logging'",sep="")), log = FALSE, invisible = FALSE) remDr <- remoteDriver(browserName = "chrome") #Abre o navegador remDr$open() #Maximiza a janela remDr$maxWindowSize()Nas etapas seguintes é possível navegar por páginas específicas e coletar as informações de interesse, por exemplo, um site muito útil para análise fundamentalista é o sítio http://fundamentus.com.br/. Se desejarmos obter os dados da PETR4, basta acessar:
#Vai para a pagina de interesse site<-"http://fundamentus.com.br/balancos.php?papel=PETR4" remDr$navigate(site)Note que para obter os dados é necessário preencher o valor do captcha, para isso, podemos usar algum sistema de Optical character recognition (OCR) para reconhecer as letras indicadas no captcha. É necessário obter a imagem do captcha, uma solução é fazer um printscreen do site e editar a imagem:
#Faz um printscreen do site library(base64enc) img<-remDr$screenshot(display = FALSE, useViewer = TRUE, file = NULL) writeBin(base64Decode(img, "raw"), 'site.png')Uma vez obtido o valor do captcha, podemos passar o resultado para o site da seguinte forma:
#Exemplo de captcha solucionado txt<-"TOWIT" #Encontra o objeto da caixa de texto webElem <- remDr$findElement(using = "name", "codigo_captcha") #Manda o resultado do captcha webElem$sendKeysToElement(list(txt)) #Encontra o objeto do botão de submit webElem <- remDr$findElement(using = "name", "submit") #Clica no botão webElem$clickElement() #Fecha as conexões remDr$close() remDr$closeServer()Note que os comandos das linhas 5 e 11 precisam ser preenchidos com base nas características do objeto de interesse na página alvo, isso pode ser feito averiguando o código fonte da página por meio de qualquer navegador. Quanto a solução do captcha existem ferramentas de Optical character recognition (OCR) e também de serviços como o http://www.deathbycaptcha.com/ que realizam esse processo.
Nenhum comentário:
Postar um comentário