SAUDAÇÕES!

Seja bem vindo à página do professor Pedro Albuquerque. Para saber mais sobre meu currículo, disciplinas ministradas e interesses de pesquisa, navegue no menu disponível no topo da página.

quinta-feira, 15 de outubro de 2015

Automação de tarefas usando rSelenium.


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.