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

[RESOLVIDO] Coletar informações da internet via VBA

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.
R0DR1G0_CWB
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Seg Mai 28, 2018 8:26 am

[RESOLVIDO] Coletar informações da internet via VBA

Mensagem por R0DR1G0_CWB »

Bom dia,

Com o apoio das dúvidas já citadas no fórum, estou criando um crawler em vba para manter atualizado certas informações que busco manualmente.

Minha dúvida até que é simples. Estou fazendo o seguintes FOR:

Código: Selecionar todos

For Each i In IE.Document.body.getElementsByTagName("span")
o i recebe o seguinte valor "[obejct HTMLSpanElement]"

Até aqui beleza, mas como na página existe vários "spans" e estou com dificuldade de identificar qual eu preciso.
Página: https://www.ferramentaskennedy.com.br/b ... cs72Xp16At

Com o apoio do Chrome vejo o seguinte:
No código:

Código: Selecionar todos

<span class="valor h6"> R$ 1.598,00 </span>
Demais infos:
span.valor.h6
innerText: "R$ 1.598,00"
  • Tentei fazer o FOR assim:

Código: Selecionar todos

For Each i In IE.Document.body.getElementsByTagName("span.valor.h6")
Mas não localiza a informação e pula essa etapa.
  • Tentei também:

Código: Selecionar todos

For Each i In IE.Document.body.getElementsByTagName("span").getAttributesByClassName("valor h6")
Que gera o erro:
Erro em tempo de execução '438'
O objeto não aceita esta propriedade ou método
  • Outra forma que tentei, também com o erro:

Código: Selecionar todos

For Each i In ie.Document.body.getElementsByTagName("span")
    For Each j In ie.Document.body.getElementsByClassName("valor h6") 
          vlr = ie.Document.body.getElementsByClassName("valor h6").innerText
    Next j
Next i
Até o FOR do J está funcionando, porém, não consigo atribuir o valor da variável VLR.



Já visitei alguns sites e fóruns diferentes e não encontro a resposta, agradeço quem puder me ajudar.
Editado pela última vez por R0DR1G0_CWB em Ter Jun 05, 2018 2:40 pm, em um total de 1 vez.


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.


Nill2016
Colaborador
Colaborador
Mensagens: 32
Registrado em: Qua Mai 09, 2018 11:34 am

Re: Coletar informações da internet via VBA

Mensagem por Nill2016 »

Já tentou usar o XPath? Esse é o XPath deste elemento //*[@id="cart_preco_22091"]/div/span[1]


R0DR1G0_CWB
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Seg Mai 28, 2018 8:26 am

Re: Coletar informações da internet via VBA

Mensagem por R0DR1G0_CWB »

Nunca ouvi falar rsss...

Mas tentei fazer assim:

Código: Selecionar todos

For Each i In By.XPath("//*[@id=" & """&cart_preco_22091&""" & "]/div/span[1]") '->linha que gera o erro
         vlr = i.getElementsByClassName("valor h6").innerText
         Range("C" & cont).Value = vlr
Next i
Não sei se apliquei sua dica de forma correta, gerou o erro 424.
(Objeto é obrigatório).

Tenho que declarar no início com as variáveis algo que de referencia ao XPath?


Nill2016
Colaborador
Colaborador
Mensagens: 32
Registrado em: Qua Mai 09, 2018 11:34 am

Re: Coletar informações da internet via VBA

Mensagem por Nill2016 »

Acho que vai ter que declarar este elemento e ainda tem que habilitar o Microsoft HTML Object Library. Eu ainda não manjo muito de como fazer isso, estou aprendendo como faz isso no selenium, porque achei que vai melhor do que o VBA simples. O VBA trava muito.


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.


R0DR1G0_CWB
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Seg Mai 28, 2018 8:26 am

Re: Coletar informações da internet via VBA

Mensagem por R0DR1G0_CWB »

Selenium para mim é novidade...
Por enquanto meu problema está apenas nessa linha que captura a informação, até o momento meu código está assim:

Código: Selecionar todos

Sub ReferenciaIE_new()
    Dim ObRef
    On Error Resume Next
    ThisWorkbook.VBProject.References.AddFromGuid "{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 1, 1
End Sub
Sub LocalizaProduto_new()
ReferenciaIE_new
    Dim Modelo, vlr        As String
    Dim UltimaLinha, cont  As Long
    Dim i, j, ie           As Object
    Dim bat
    UltimaLinha = Worksheets("BuscaPreços").Cells(Worksheets("BuscaPreços").Rows.Count, 1).End(xlUp).Row
    Set ie = CreateObject("InternetExplorer.Application")
    For cont = 2 To UltimaLinha
        Modelo = Range("B" & cont).Value
        With ie
            .Visible = False
            .Navigate "https://www.ferramentaskennedy.com.br/busca?q=" & Modelo
        End With
        While ie.ReadyState <> READYSTATE_COMPLETE
            Wend
              sng = Timer
        Do While sng + 3 > Timer
        Loop
        For Each i In By.XPath("//*[@id=""cart_preco_22091""]/div/span[1]")
'        For Each i In ie.Document.body.getElementsByClassName("valor h6")
            vlr = i.getElementsByClassName("valor h6").innerText
            Range("C" & cont).Value = vlr
        Next i
    Next cont
    bat = Shell("C:\FinalizaIexplore.bat", 1)
    MsgBox "Concluído!"
End Sub


Nill2016
Colaborador
Colaborador
Mensagens: 32
Registrado em: Qua Mai 09, 2018 11:34 am

Re: Coletar informações da internet via VBA

Mensagem por Nill2016 »

Pesquisando achei este post acho que vai te ajudar pois tem o mesmo objetivo de pesquisar valores.

https://www.aswinvanwoudenberg.com/2009 ... ual-basic/


R0DR1G0_CWB
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Seg Mai 28, 2018 8:26 am

Re: Coletar informações da internet via VBA

Mensagem por R0DR1G0_CWB »

Tentei seguir essas dicas, além de outras, e ainda não tive sucesso.


Avatar do usuário
Mikel Silveira Fraga
Jedi
Jedi
Mensagens: 1173
Registrado em: Sex Mai 27, 2011 3:27 pm
Localização: Governador Valadares - MG
Contato:

Re: Coletar informações da internet via VBA

Mensagem por Mikel Silveira Fraga »

Boa noite a todos.

Rodrigo e Nill, pelo que vi dos códigos e das dúvidas, vocês estão fazendo uma certa confusão.

O código utilizado inicialmente pelo Rodrigo, é baseado na biblioteca do Microsoft Internet Controls. Depois da dica sobre o uso de xPath que começou a confusão, pois o IE Controls não possui o recurso de se trabalhar com xPath, apenas o Selenium Basic.

Ou seja, misturaram Métodos e Propriedades de duas bibliotecas. Por isso não esta funcionando as aplicações.

Pela parte do código Html do Span que mostrou, pode tentar fazer a seguinte aplicação de código:

Código: Selecionar todos

For Each i In IE.Document.body.getElementsByTagName("span")
  If i.className = "valor h6" Then vlr = i.innerText
Next I
Tem um tempo que não mexo com IE Controls, então posso estar errado. Mas vale a pena testar e nos retornar.

Fico no aguardo.


R0DR1G0_CWB
Acabou de chegar
Acabou de chegar
Mensagens: 6
Registrado em: Seg Mai 28, 2018 8:26 am

Re: Coletar informações da internet via VBA

Mensagem por R0DR1G0_CWB »

Bom dia Mikel,

Obrigado pelos esclarecimentos.

Fiz o teste conforme orientado e não gerou erro, porém não entrou no IF.
Não entendo o motivo, pois conforme o Html o nome do Class está correto.
Anexos
Print.png
Print.png (16.94 KiB) Exibido 10197 vezes


Avatar do usuário
Mikel Silveira Fraga
Jedi
Jedi
Mensagens: 1173
Registrado em: Sex Mai 27, 2011 3:27 pm
Localização: Governador Valadares - MG
Contato:

Re: Coletar informações da internet via VBA

Mensagem por Mikel Silveira Fraga »

Rodrigo, bom dia.

Cara, não tenho como realizar os testes, pois deve ser uma área restrita que você esta tentando consultar.

No geral, tente fazer o seguinte:
- Na janela de edição do VBE, ative a Janela de Verificação Imediata, indo no menu Exibir/Janela "Verificação Imediata" (Ctrl + G);
- Com a janela mencionada acima aberta, entre com o código abaixo:

Código: Selecionar todos

For Each i In IE.Document.body.getElementsByTagName("span")
  Debug.Print "className: " & i.className & " --- innerText: " & i.innerText & " --- innterHtml: " & i.innerHTML
Next I
Depois que rodar esse código, veja se os valores serão escrito em algum lugar da janela de verificação.

Estou suspeitando que esse elemento possa estar em algum outro bloco que não esteja sendo lido pela rotina.

Teste e retorne o resultado. Duvidas, a disposição.


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