Vídeo recomendado
https://youtu.be/diWPPPhW-9E
https://youtu.be/diWPPPhW-9E
Selenium + VBA + Multiplas Páginas = lentidão
Selenium + VBA + Multiplas Páginas = lentidão
Olá pessoal do Forúm!
Pessoal, estou com o seguinte problema. Na empresa onde trabalho me colocaram com a responsabilidade de "cuidar" dos Backups dos clientes. Lá ocorre assim. O Backup é feito 2 vezes, 1 vez ele fica armazenado no próprio servidor do cliente e no outro ele é enviado à um repositório no DropBox. Quando o backup é feito na máquina é enviado uma informação para um site de gerenciamento da empresa e com Nome do cliente, data/hora etc... e o mesmo é feito quando ele "sobe" para a nuvem, mas este é enviado para um site do próprio DropBox.
Agora estão me pediram para ficar olhando quais clientes o backup ultrapassa 48 hrs de atraso e assim verificar o que está ocorrendo. o PROBLEMAAAAAA é que são mais de 300 clientes e olhar 1 por 1 é uma tarefa demasiadamente árdua.
Pensando nisso resolvi automatizar a tarefa, onde, com ajuda do Selenium e um pouco de VBA eu busco as informações dos 2 sites e assim posso criar um DashBoard que me traga somente informações necessárias para facilitar minha vida.
No Site de Gerenciamento da empresa foi tudo maravilhoso. Como os clientes e informações dos mesmos estão dispostos em tabela, me basta logar, acessar a parte de backups, buscar essa tabela pelo Xpath e enviar para o Excel apenas os elementos que me eram necessários. No DropBox que veio o problema. Lá existe a tabela com todos os clientes, mas as informações de cada um deles se encontram em paginas (http) separadas, ou seja, para acessar as informações de um determinado Cliente no DropBox eu preciso abrir uma outra página do site. Em resumo, para atualizar 300 clientes preciso abrir 300 paginas e é aqui o PROBLEMA.
Para abrir as páginas e buscar os dados, sem problemas, coloquei um "isElementPresent" para identificar o ultimo cliente (visto que pode aumentar e diminuir devido adesão e exclusão dos mesmos) e mandei um Do While para ir abrindo pagina por página e enviando ao Excel. Todavia, eu preciso dar um "delay" para o total carregamento da página (cerca de 10 segundos), ou seja, para atualizar cada cliente meu loop leva em torno de 11 segundos (10 de carregamento e 1 para todo o resto). Agora multiplique 11 segundos por 300 clientes e teremos "míseros" 3.300 segundos (55 minutos) para que todos os dados sejam trazidos para a planilha do Excel.
Diante do disposto acima, gostaria de saber se vocês conseguem imaginar uma solução mais viável, que possa fazer diminuir esse tempo, quem sabe para uns 15 minutos (não ideal, mas aceitável). Enquanto escrevia me ocorreu a opção de abrir de 10 em 10 páginas, talvez diminua consideravelmente (5~6 minutos totais), mas se tiverem outras ideias, estou aberto à experimentação.
Bom, é isso! Desde já agradeço, Obrigado!!!
Pessoal, estou com o seguinte problema. Na empresa onde trabalho me colocaram com a responsabilidade de "cuidar" dos Backups dos clientes. Lá ocorre assim. O Backup é feito 2 vezes, 1 vez ele fica armazenado no próprio servidor do cliente e no outro ele é enviado à um repositório no DropBox. Quando o backup é feito na máquina é enviado uma informação para um site de gerenciamento da empresa e com Nome do cliente, data/hora etc... e o mesmo é feito quando ele "sobe" para a nuvem, mas este é enviado para um site do próprio DropBox.
Agora estão me pediram para ficar olhando quais clientes o backup ultrapassa 48 hrs de atraso e assim verificar o que está ocorrendo. o PROBLEMAAAAAA é que são mais de 300 clientes e olhar 1 por 1 é uma tarefa demasiadamente árdua.
Pensando nisso resolvi automatizar a tarefa, onde, com ajuda do Selenium e um pouco de VBA eu busco as informações dos 2 sites e assim posso criar um DashBoard que me traga somente informações necessárias para facilitar minha vida.
No Site de Gerenciamento da empresa foi tudo maravilhoso. Como os clientes e informações dos mesmos estão dispostos em tabela, me basta logar, acessar a parte de backups, buscar essa tabela pelo Xpath e enviar para o Excel apenas os elementos que me eram necessários. No DropBox que veio o problema. Lá existe a tabela com todos os clientes, mas as informações de cada um deles se encontram em paginas (http) separadas, ou seja, para acessar as informações de um determinado Cliente no DropBox eu preciso abrir uma outra página do site. Em resumo, para atualizar 300 clientes preciso abrir 300 paginas e é aqui o PROBLEMA.
Para abrir as páginas e buscar os dados, sem problemas, coloquei um "isElementPresent" para identificar o ultimo cliente (visto que pode aumentar e diminuir devido adesão e exclusão dos mesmos) e mandei um Do While para ir abrindo pagina por página e enviando ao Excel. Todavia, eu preciso dar um "delay" para o total carregamento da página (cerca de 10 segundos), ou seja, para atualizar cada cliente meu loop leva em torno de 11 segundos (10 de carregamento e 1 para todo o resto). Agora multiplique 11 segundos por 300 clientes e teremos "míseros" 3.300 segundos (55 minutos) para que todos os dados sejam trazidos para a planilha do Excel.
Diante do disposto acima, gostaria de saber se vocês conseguem imaginar uma solução mais viável, que possa fazer diminuir esse tempo, quem sabe para uns 15 minutos (não ideal, mas aceitável). Enquanto escrevia me ocorreu a opção de abrir de 10 em 10 páginas, talvez diminua consideravelmente (5~6 minutos totais), mas se tiverem outras ideias, estou aberto à experimentação.
Bom, é isso! Desde já agradeço, Obrigado!!!
Re: Selenium + VBA + Multiplas Páginas = lentidão
Como não é possível acessar essa página interna para análise, poste o seu código para avaliação.
Att,
Raygsson
Att,
Raygsson
Re: Selenium + VBA + Multiplas Páginas = lentidão
Olá Raygsson, obrigado por responder!
Segue abaixo parte do código onde faço a pesquisa no DropBox
Código: Selecionar todos
Sub autalizaTabelaDroopBox()
Dim linkDrop As Variant
'Dim internet As Selenium.ChromeDriver
Plan4.Activate
Range("A1").Select
Do While ActiveCell.Value <> ""
Dim ck As New By
Dim top As String
Dim i, j
i = 1
j = 1
linkDrop = ActiveCell.Hyperlinks(1).Address 'pra pegar o link do cliente em uma tabela anteriormente atualizada
Set internet = New Selenium.ChromeDriver
If ActiveCell.Value = "TESTE" Then 'só pra pular um "cliente" de teste que temos, ao qual não me interessa trazer os dados, até porque é uma tabela enormeeeeeee...
ActiveCell.Offset(0, 1).Select
Else
With internet
.Start
.Get linkDrop
Application.Wait (Now + TimeValue("00:00:10"))
End With
End If
Dim tabelaDataHora(50, 50) As WebElement
Dim testador As WebElement
Set testador = internet.FindElementByXPath("//tr[1]/td[1]/div") ' só uma verificação se a pagina desse cliente não está vazia.. depois eu coloco pra pular ou alguma outra coisa...
ActiveCell.Offset(1, 0).Select
For i = 1 To 50
If testador.IsElementPresent(ck.XPath("//tr[" & i & "]/td")) Then ' faz a verificação se o item existe, para saber se chegamos ao ultimo item
For j = 2 To 2 'começa e termina em 2 porque só quero a 2° coluna dessa tabela
Set testador = internet.FindElementByXPath("//tr[" & i & "]/td")
Set tabelaDataHora(i, j) = internet.FindElementByXPath("//tr[" & i & "]/td[" & j & "]/div")
top = tabelaDataHora(i, j).Text
ActiveCell.Value = top
ActiveCell.Offset(1, 0).Select
Next j
Else
'MsgBox "Elemento não existe"
Exit For
Exit For
End If
Next i
internet.Quit
Selection.End(xlUp).Select
ActiveCell.Offset(0, 1).Select
Loop
End Sub
Re: Selenium + VBA + Multiplas Páginas = lentidão
Pra melhorar a velocidade deve retirar essa espera:
Troque por uma espera mais dinâmica:
Nesse site que fiz o teste tem uma tabela que carrega depois do carregamento na página, esperando apenas pelo ".Get" não daria certo.
Att,
Raygsson
Código: Selecionar todos
Application.Wait (Now + TimeValue("00:00:10"))
Código: Selecionar todos
Sub autalizaTabelaDroopBox()
Set internet = New ChromeDriver
Dim ck As New by
With internet
.Get "https://www.infomoney.com.br/cotacoes/ibovespa/historico/"
elemento = "/html/body/div[5]/div/div[1]/div[2]/div/table/tbody/tr[50]/td[1]"
If .IsElementPresent(ck.XPath(elemento), 10000) Then 'ESPERA ATÉ 10S A PRESENÇA DO ELEMENTO
'BLOCO ELEMENTO PRESENTE
Else
'BLOCO ELEMENTO INEXISTENTE
End If
.Quit
End With
End Sub
Att,
Raygsson
Re: Selenium + VBA + Multiplas Páginas = lentidão
Mais uma vez, muito obrigado, Raygsson!
No Internet Explorer usava o "READYSTATE da página e não sabia como fazer aqui. Coloquei pra rodar enquanto escrevo aqui é já deu pra perceber que melhorou bastante o tempo. De toda forma, vou colocar pra abrir de várias em várias + o que me passou que eu acho que vai ficar "TOP".
Vlw ae..
No Internet Explorer usava o "READYSTATE da página e não sabia como fazer aqui. Coloquei pra rodar enquanto escrevo aqui é já deu pra perceber que melhorou bastante o tempo. De toda forma, vou colocar pra abrir de várias em várias + o que me passou que eu acho que vai ficar "TOP".
Vlw ae..