Raspando dados do site usando vba

Estou tentando raspar dados do site: http://uk.investing.com/rates-bonds/financial-futures via vba, como o preço em tempo real, ou seja, alemão 5 YR Bobl, US 30Y T-Bond, eu tentei excel consulta web, mas apenas raspa todo o site, mas eu gostaria de raspar apenas a taxa, existe uma maneira de fazer isso?

Existem várias maneiras de fazer isso. Esta é uma resposta que escrevo esperando que todos os fundamentos da automação do Internet Explorer sejam encontrados ao procurar pelas palavras-chave “raspando dados do site”, mas lembre-se de que nada vale como sua própria pesquisa (se você não quiser manter códigos pré-escritos que você não pode personalizar).

Por favor, note que este é um caminho , que eu não prefiro em termos de desempenho (uma vez que depende da velocidade do navegador), mas isso é bom para entender a lógica por trás da automação da Internet.

1) Se eu precisar navegar na web, preciso de um navegador! Então eu crio um navegador Internet Explorer:

Dim appIE As Object Set appIE = CreateObject("internetexplorer.application") 

2) Eu peço ao navegador para navegar na página da web de destino. Através do uso da propriedade “.Visible”, decido se quero ver o navegador fazendo seu trabalho ou não. Ao construir o código é bom ter Visible = True , mas quando o código está trabalhando para capturar dados é bom não vê-lo toda vez que Visible = False .

 With appIE .Navigate "http://uk.investing.com/rates-bonds/financial-futures" .Visible = True End With 

3) A página da web precisará de algum tempo para carregar. Então, eu vou esperar enquanto isso está ocupado …

 Do While appIE.Busy DoEvents Loop 

4) Bem, agora a página está carregada. Vamos dizer que eu quero raspar a mudança do US30Y T-Bond: O que eu vou fazer é apenas clicar em F12 no Internet Explorer para ver o código da página, e, portanto, usando o ponteiro (no círculo vermelho) vou clicar no elemento que Eu quero raspar para ver como posso alcançar o meu propósito.

insira a descrição da imagem aqui

5) O que devo fazer é direto. Primeiro de tudo, eu vou obter pela propriedade ID o elemento tr que contém o valor:

 Set allRowOfData = appIE.document.getElementById("pair_8907") 

Aqui eu vou pegar uma coleção de elementos td (especificamente, tr é uma linha de dados, e o td são suas células. Estamos procurando pelo oitavo, então vou escrever:

 Dim myValue As String: myValue = allRowOfData.Cells(7).innerHTML 

Por que escrevi 7 em vez de 8? Como as collections de células começam em 0, o índice do oitavo elemento é 7 (8-1). Logo analisando esta linha de código:

  • .Cells() me faz acessar os elementos td ;
  • innerHTML é a propriedade da célula que contém o valor que procuramos.

Quando tivermos nosso valor, que agora está armazenado na variável myValue , podemos apenas fechar o navegador IE e liberar a memory definindo-a como Nothing:

 appIE.Quit Set appIE = Nothing 

Bem, agora você tem seu valor e pode fazer o que quiser com ele: coloque-o em uma célula ( Range("A1").Value = myValue ) ou em um label de um formulário ( Me.label1.Text = myValue ).

Gostaria apenas de salientar que não é assim que funciona o StackOverflow: aqui você publica perguntas sobre problemas específicos de codificação, mas você deve fazer sua própria pesquisa primeiro. A razão pela qual eu estou respondendo a uma pergunta que não está mostrando muito esforço de pesquisa é apenas que eu a vejo várias vezes e, de volta ao tempo em que aprendi como fazer isso, eu lembro que eu teria gostado de ter um pouco melhor suporte para começar com. Por isso, espero que esta resposta, que é apenas uma “input de estudo” e não a melhor / mais completa solução, possa ser um suporte para o próximo usuário com o mesmo problema. Porque aprendi a programar graças a essa comunidade, e gosto de pensar que você e outros iniciantes podem usar minha contribuição para descobrir o belo mundo da programação.

Aproveite sua prática;)

Você pode usar o object winhttprequest em vez do Internet Explorer, pois é bom para carregar os dados, excluindo fotos n anúncio em vez de baixar página completa, incluindo propaganda n fotos que fazem object pesado Internet Explorer comparar com object winhttpRequest.

Esta pergunta foi feita muito antes. Mas eu pensei que a informação seguinte será útil para iniciantes. Na verdade, você pode facilmente obter os valores do nome da class como este.

 Sub ExtractLastValue() Set objIE = CreateObject("InternetExplorer.Application") objIE.Top = 0 objIE.Left = 0 objIE.Width = 800 objIE.Height = 600 objIE.Visible = True objIE.Navigate ("https://uk.investing.com/rates-bonds/financial-futures/") Do DoEvents Loop Until objIE.readystate = 4 MsgBox objIE.document.getElementsByClassName("pid-8907-last")(0).innerText End Sub 

E se você é novo no web scrape, leia este post no blog.

Web Scraping – Noções Básicas

E também existem várias técnicas para extrair dados de páginas da web. Este artigo explica alguns deles com exemplos.

Captura de dados na web – Coletando dados de uma página da web

Eu modifiquei algo que estava aparecendo erro para mim e acabei com isso que funcionou muito bem para extrair os dados como eu precisava:

 Sub get_data_web() Dim appIE As Object Set appIE = CreateObject("internetexplorer.application") With appIE .navigate "https://finance.yahoo.com/quote/NQ%3DF/futures?p=NQ%3DF" .Visible = True End With Do While appIE.Busy DoEvents Loop Set allRowofData = appIE.document.getElementsByClassName("Ta(end) BdT Bdc($c-fuji-grey-c) H(36px)") Dim i As Long Dim myValue As String Count = 1 For Each itm In allRowofData For i = 0 To 4 myValue = itm.Cells(i).innerText ActiveSheet.Cells(Count, i + 1).Value = myValue Next Count = Count + 1 Next appIE.Quit Set appIE = Nothing End Sub 

Outros methods foram mencionados, então, por favor, reconheçamos que, no momento em que escrevemos, estamos no século XXI. Vamos estacionar a abertura do navegador de barramento local e voar com uma solicitação XMLHTTP GET (XHR GET para breve).

Wiki moment:

O XHR é uma API na forma de um object cujos methods transferem dados entre um navegador da web e um servidor da web. O object é fornecido pelo ambiente JavaScript do navegador

É um método rápido para recuperar dados que não exigem a abertura de um navegador. A resposta do servidor pode ser lida em um documento HTML e o processo de captura da tabela continua a partir daí.

No código abaixo, a tabela é cr1 pelo id cr1 .

mesa

No sub auxiliar, WriteTable , fazemos o loop das colunas ( td tags) e, em seguida, as linhas da tabela ( tr tags) e, finalmente, percorremos o comprimento de cada linha da tabela, célula da tabela por célula da tabela. Como queremos apenas dados das colunas 1 e 8, uma declaração Select Case é usada para especificar o que está escrito na planilha.


Exemplo de visualização da página da web:

Visualização de página de amostra


Saída do código de amostra:

Saída de código


VBA:

 Option Explicit Public Sub GetRates() Dim sResponse As String, html As New HTMLDocument '<== Tools > References > HTML Object Library Dim hTable As HTMLTable Application.ScreenUpdating = False With CreateObject("MSXML2.XMLHTTP") .Open "GET", "https://uk.investing.com/rates-bonds/financial-futures", False .send sResponse = StrConv(.responseBody, vbUnicode) End With sResponse = Mid$(sResponse, InStr(1, sResponse, "