Página 1 de 2

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

Enviado: Seg Mai 28, 2018 8:50 am
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.

Re: Coletar informações da internet via VBA

Enviado: Ter Mai 29, 2018 8:12 pm
por Nill2016
Já tentou usar o XPath? Esse é o XPath deste elemento //*[@id="cart_preco_22091"]/div/span[1]

Re: Coletar informações da internet via VBA

Enviado: Qua Mai 30, 2018 8:33 am
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?

Re: Coletar informações da internet via VBA

Enviado: Qua Mai 30, 2018 9:53 am
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.

Re: Coletar informações da internet via VBA

Enviado: Qua Mai 30, 2018 10:08 am
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

Re: Coletar informações da internet via VBA

Enviado: Qua Mai 30, 2018 10:14 am
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/

Re: Coletar informações da internet via VBA

Enviado: Seg Jun 04, 2018 11:37 am
por R0DR1G0_CWB
Tentei seguir essas dicas, além de outras, e ainda não tive sucesso.

Re: Coletar informações da internet via VBA

Enviado: Ter Jun 05, 2018 12:27 am
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.

Re: Coletar informações da internet via VBA

Enviado: Ter Jun 05, 2018 10:17 am
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.

Re: Coletar informações da internet via VBA

Enviado: Ter Jun 05, 2018 10:33 am
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.