Vídeo recomendado
https://youtu.be/diWPPPhW-9E

Selenium + VBA + Multiplas Páginas = lentidão

A Web está aí, não há como negar. Ela é onipresente em praticamente toda operação eletrônica realizada nos dias de hoje. Como não podia ser diferente, o Excel, ferramenta máxima para analistas e profissionais das mais diversas áreas do mercado precisa estar alinhado com esta necesssidade. E ele está! Neste forum, o debate é focado em expor dúvidas, sugestões, modelos de código e exemplos de uso do Excel na Integração com tecnologias Web.
Xmauzack_
Acabou de chegar
Acabou de chegar
Mensagens: 3
Registrado em: Sex Out 02, 2020 11:54 am

Selenium + VBA + Multiplas Páginas = lentidão

Mensagem por Xmauzack_ »

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!!!


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Raygsson
Manda bem
Manda bem
Mensagens: 118
Registrado em: Sex Jan 31, 2020 8:06 pm

Re: Selenium + VBA + Multiplas Páginas = lentidão

Mensagem por Raygsson »

Como não é possível acessar essa página interna para análise, poste o seu código para avaliação.

Att,
Raygsson


Xmauzack_
Acabou de chegar
Acabou de chegar
Mensagens: 3
Registrado em: Sex Out 02, 2020 11:54 am

Re: Selenium + VBA + Multiplas Páginas = lentidão

Mensagem por Xmauzack_ »

Raygsson escreveu: Sex Out 02, 2020 11:20 pm Como não é possível acessar essa página interna para análise, poste o seu código para avaliação.

Att,
Raygsson
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


Raygsson
Manda bem
Manda bem
Mensagens: 118
Registrado em: Sex Jan 31, 2020 8:06 pm

Re: Selenium + VBA + Multiplas Páginas = lentidão

Mensagem por Raygsson »

Pra melhorar a velocidade deve retirar essa espera:

Código: Selecionar todos

Application.Wait (Now + TimeValue("00:00:10"))
Troque por uma espera mais dinâmica:

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
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


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Xmauzack_
Acabou de chegar
Acabou de chegar
Mensagens: 3
Registrado em: Sex Out 02, 2020 11:54 am

Re: Selenium + VBA + Multiplas Páginas = lentidão

Mensagem por Xmauzack_ »

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..


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder