Página 1 de 1

[RESOLVIDO]Lentidão para acessar e coletar dados na web

Enviado: Sex Nov 16, 2018 4:32 pm
por Wagner.cwb
Olá Amigos,

eu consegui criar um script que acessa o site do clima tempo e coleta a informação da condição do vento do momento.
É um código bem simples, pois o site não requer autenticação, porém estou achando muito lento, digo isso, pois é mais rápido o usuário fazer a coleta dos dados manualmente do que o próprio script rs
ah também está "esgotando" a máquina, pois depois de 10 processamentos, simplesmente trava tudo.

Por favor, podem me ajudar a melhorá-lo para deixá-lo mais eficiente?

Código: Selecionar todos

Sub climatempo()

'http://www.tomasvasquez.com.br/blog/microsoft-office/vba/vba-ocultando-o-navegador-no-selenium/

Set driver = New ChromeDriver

driver.AddArgument ("--headless")

driver.get "https://www.climatempo.com.br/vento/cidade/271/curitiba-pr"
Application.Wait Now + TimeValue("00:00:01")

Set Label_vento_CTA = driver.FindElementById("momento-vento")

Worksheets("Plan1").Range("AC2") = Label_vento_CTA.Text

driver.get "https://www.climatempo.com.br/previsao-do-tempo/cidade/268/cascavel-pr"
Application.Wait Now + TimeValue("00:00:01")

Set Label_vento_CEL = driver.FindElementById("momento-vento")
Worksheets("Plan1").Range("AC3") = Label_vento_CEL.Text

driver.get "https://www.climatempo.com.br/previsao-do-tempo/cidade/277/londrina-pr"
Application.Wait Now + TimeValue("00:00:01")

Set Label_vento_LNA = driver.FindElementById("momento-vento")

Worksheets("Plan1").Range("AC4") = Label_vento_LNA.Text

driver.get "https://www.climatempo.com.br/previsao-do-tempo/cidade/278/maringa-pr"
Application.Wait Now + TimeValue("00:00:01")

Set Label_vento_MGA = driver.FindElementById("momento-vento")
Worksheets("Plan1").Range("AC5") = Label_vento_MGA.Text

driver.get "https://www.climatempo.com.br/previsao-do-tempo/cidade/279/pontagrossa-pr"
Application.Wait Now + TimeValue("00:00:01")


Set Label_vento_PGO = driver.FindElementById("momento-vento")
Worksheets("Plan1").Range("AC6") = Label_vento_PGO.Text

Set Label_Atualizacao = driver.FindElementById("momento-atualizacao")
Worksheets("Plan1").Range("AC7") = Label_Atualizacao.Text

driver.Quit


End Sub
Vou deixar em anexo a planilha para facilitar o entendimento.

abraços!

Re: Lentidão para acessar e coletar dados na web

Enviado: Sex Nov 16, 2018 8:16 pm
por webmaster
Primeiro, o Selenium espera a página terminar de carregar quando você utiliza um Get. Portanto, o Application.Wait depois de cada Get é desnecessário.

Tirando isso, não tem muito o que fazer. Pelo que vi, você está só extraindo dados da página, sem navegação. Nesse caso, acho melhor usar HttpReq e fazer o parse do HTML em memória. Aqui um exemplo:

https://stackoverflow.com/a/17063741/1209721

Re: Lentidão para acessar e coletar dados na web

Enviado: Sex Nov 16, 2018 8:18 pm
por webmaster
Acabo de ver que o ClimaTempo tem API Rest. Acredito ser uma alternativa melhor:

https://advisor.climatempo.com.br/

Aqui um exemplo de como consumir uma API Rest no VBA:

https://stackoverflow.com/a/38258514/1209721

Você provavelmente precisará de credenciais. Aí só seguir a documentação do próprio site.

Re: Lentidão para acessar e coletar dados na web

Enviado: Sáb Nov 17, 2018 4:23 pm
por Wagner.cwb
Obrigado Amigo, sempre trazendo opções.

Vou estudar mais a respeito e trago aqui os resultados.

abs!

Re: Lentidão para acessar e coletar dados na web

Enviado: Sáb Nov 17, 2018 5:28 pm
por Wagner.cwb
webmaster escreveu: Sex Nov 16, 2018 8:16 pm Primeiro, o Selenium espera a página terminar de carregar quando você utiliza um Get. Portanto, o Application.Wait depois de cada Get é desnecessário.

Tirando isso, não tem muito o que fazer. Pelo que vi, você está só extraindo dados da página, sem navegação. Nesse caso, acho melhor usar HttpReq e fazer o parse do HTML em memória. Aqui um exemplo:

https://stackoverflow.com/a/17063741/1209721
Fiquei bastante curioso com esta sugestão que você passou.
Por favor, você pode me ajudar na minha aplicação?

cod original

Código: Selecionar todos

TargetURL = "https://www.mysite.co.uk/app/api/v1/test"
Set HTTPReq = CreateObject("WinHttp.WinHttpRequest.5.1")
HTTPReq.Option(4) = 13056 '
HTTPReq.Open "PUT", TargetURL, False
HTTPReq.SetCredentials "user", "password", 0
HTTPReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
HTTPReq.send ("test[status]=" & Forms!curl!Text0.Value & "&test2[status]=" & Text2.Value)
MsgBox (HTTPReq.responseText)
No exemplo do site, eu tentei modificar para a minha realidade da seguinte forma:

Eu eliminei a linha - HTTPReq.SetCredentials "user", "password", 0 (pois não preciso autenticar)

Código: Selecionar todos

Sub AlertaTemporal()

Set driver = New ChromeDriver

TargetURL = "https://www.climatempo.com.br/vento/cidade/271/curitiba-pr"
Set HTTPReq = CreateObject("WinHttp.WinHttpRequest.5.1")
HTTPReq.Option(4) = 13056
HTTPReq.Open "PUT", TargetURL, False

HTTPReq.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
HTTPReq.send ("test[status]=" & forms!curl!Text0.Value & "&test2[status]=" & Text2.Value)
MsgBox (HTTPReq.responseText)
End sub

Não tive sucesso... erro 424 - o objeto é obrigatório >

HTTPReq.send ("test[status]=" & forms!curl!Text0.Value & "&test2[status]=" & Text2.Value)

tá na cara que eu não entendi o código rs

Re: Lentidão para acessar e coletar dados na web

Enviado: Ter Nov 20, 2018 11:43 am
por webmaster
Wagner,

Perdoe. Não está sobrando muito tempo para colocar um código de exemplo. Só quero adiantar que o WinHTTPRequest vale a pena para fazer extração de dados de página sem muita navegação. Se precisar navegar para algum lugar da página, você terá que simular toda a submissão HTTP (POST/PUT/PATCH).

Como no seu código só vi simples acessos a páginas, imaginei que o WinHTTPRequest fosse a melhor alternativa. Ele te devolverá todo o HTML para você fazer o que quiser.

Vou tentar (sem promessas) faz um exemplo aqui depois.

Re: Lentidão para acessar e coletar dados na web

Enviado: Qui Nov 22, 2018 8:12 pm
por Wagner.cwb
Obrigado meu caro!

Fiquei muito curioso com esta opção, fico aguardando, mesmo não sendo uma promessa rs
Nesse intervalo irei buscar informações.

Re: Lentidão para acessar e coletar dados na web

Enviado: Sex Nov 23, 2018 2:23 am
por webmaster
Obrigado pela paciência. Consertei o texto acima. Quando o li novamente, percebi que estava quando ininteligível. Perdoe.

Re: Lentidão para acessar e coletar dados na web

Enviado: Seg Dez 03, 2018 9:38 pm
por Wagner.cwb
Tranquilo amigo!
suas considerações foram importantes e realizei algumas mudanças e avancei bastante.
Eu vou criar outro post sobre outro desafio que encontrei aqui.

Obrigado pela paciência e pelo tempo que você se dedica em ajudar os outros.

Re: [RESOLVIDO]Lentidão para acessar e coletar dados na web

Enviado: Seg Dez 03, 2018 9:41 pm
por Wagner.cwb
Eu estudei outros artigos do blog Tomás e passei a usar a exportação de tabelas.

http://www.tomasvasquez.com.br/blog/tag/seleniumbasic/

Para quem tiver curiosidade para saber qual foi a solução.
Eu mudei a minha fonte de dados para o site https://www.windy.com/
e passei a usar a exportação de tabelas via selenium.

abs!