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