Raspado de datos del sitio web usando vba

Estoy tratando de obtener datos del sitio web: http://uk.investing.com/rates-bonds/financial-futures via vba, como precio en tiempo real, es decir, German 5 YR Bobl, US 30Y T-Bond, he intentado con Excel consulta web, pero solo raspa todo el sitio web, pero me gustaría raspar solo la tasa, ¿hay alguna manera de hacerlo?

Hay varias maneras de hacer esto. Esta es una respuesta que escribo con la esperanza de que se encontrarán todos los elementos básicos de la automatización de Internet Explorer al buscar las palabras clave “raspado de datos del sitio web”, pero recuerde que nada vale tanto como su propia investigación (si no quiere apegarse a códigos pre-escritos que no puedes personalizar).

Tenga en cuenta que esta es una de las formas , que no prefiero en términos de rendimiento (ya que depende de la velocidad del navegador), pero eso es bueno para entender la razón de ser de la automatización de Internet.

1) Si necesito navegar por la web, ¡necesito un navegador! Entonces creo un navegador de Internet Explorer:

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

2) Le pido al navegador que explore la página web de destino. Mediante el uso de la propiedad “.Visible”, decido si quiero que el navegador haga o no su trabajo. Cuando se construye el código, es bueno tener Visible = True , pero cuando el código está funcionando para raspar datos, es bueno no verlo cada vez, tan Visible = False .

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

3) La página web necesitará algo de tiempo para cargar. Así que esperaré mientras tanto esté ocupado …

 Do While appIE.Busy DoEvents Loop 

4) Bueno, ahora la página está cargada. Digamos que quiero borrar el cambio del T-Bond US30Y: lo que haré es presionar F12 en Internet Explorer para ver el código de la página web y, por lo tanto, usar el puntero (en círculo rojo) haré clic en el elemento que Quiero rasparme para ver cómo puedo alcanzar mi propósito.

enter image description here

5) Lo que debería hacer es sencillo. En primer lugar, obtendré por la propiedad ID el elemento tr que contiene el valor:

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

Aquí obtendré una colección de elementos td (específicamente, tr es una fila de datos, y td son sus celdas. Estamos buscando el 8º, entonces voy a escribir:

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

¿Por qué escribí 7 en lugar de 8? Debido a que las colecciones de celdas comienzan desde 0, entonces el índice del octavo elemento es 7 (8-1). En breve se analiza esta línea de código:

  • .Cells() me hace acceder a los elementos td ;
  • innerHTML es la propiedad de la celda que contiene el valor que buscamos.

Una vez que tengamos nuestro valor, que ahora está almacenado en la variable myValue , podemos simplemente cerrar el navegador IE y liberar la memoria configurándola en Nothing:

 appIE.Quit Set appIE = Nothing 

Bueno, ahora tiene su valor y puede hacer lo que quiera con él: ponerlo en una celda ( Range("A1").Value = myValue ), o en una etiqueta de un formulario ( Me.label1.Text = myValue )

Solo quiero señalar que no es así como funciona StackOverflow: aquí publica preguntas sobre problemas específicos de encoding, pero primero debe hacer su propia búsqueda. La razón por la que estoy respondiendo una pregunta que no muestra demasiado esfuerzo de investigación es porque lo veo varias veces y, cuando aprendí a hacerlo, recuerdo que me hubiera gustado tener algo mejor. apoyo para comenzar. Así que espero que esta respuesta, que es solo una “aportación al estudio” y no la mejor / la más completa, pueda ser un apoyo para el próximo usuario que tenga su mismo problema. Porque aprendí a progtwigr gracias a esta comunidad, y me gusta pensar que usted y otros principiantes podrían usar mi información para descubrir el hermoso mundo de la progtwigción.

Disfruta de tu práctica;)

puede usar el objeto winhttprequest en lugar de internet explorer, ya que es bueno cargar datos sin incluir imágenes n publicidad, en lugar de descargar páginas web completas, incluidas las imágenes publicitarias n que hacen que el objeto internet explorer se compare con el objeto winhttpRequest.

Esta pregunta hace mucho tiempo. Pero pensé que la siguiente información sería útil para los novatos. De hecho, puedes obtener fácilmente los valores del nombre de clase de esta manera.

 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 

Y si eres nuevo en el web scraping, lee esta publicación en el blog.

Raspado web: conceptos básicos

Y también hay varias técnicas para extraer datos de páginas web. Este artículo explica algunos de ellos con ejemplos.

Web Scraping: recostackción de datos de una página web

Modifiqué algo que estaba apareciendo error para mí y terminé con esto, que funcionó muy bien para extraer los datos que necesitaba:

 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 

Se mencionaron otros métodos, así que reconozcamos que, al momento de escribir, estamos en el siglo XXI. Aparquemos la apertura del navegador de bus local , y vuelemos con una solicitud XMLHTTP GET (XHR GET para abreviar).

Momento de Wiki:

XHR es una API en forma de un objeto cuyos métodos transfieren datos entre un navegador web y un servidor web. El objeto es proporcionado por el entorno de JavaScript del navegador

Es un método rápido para recuperar datos que no requieren abrir un navegador. La respuesta del servidor se puede leer en un HTMLDocument y el proceso de agarrar la tabla continúa desde allí.

En el siguiente código, la tabla es cr1 por su id cr1 .

mesa

En el sub auxiliar, WriteTable , hacemos un bucle en las columnas (tags td ) y luego en las filas de la tabla (tags tr ), y finalmente recorremos la longitud de cada fila de la tabla, celda de la tabla por celda de la tabla. Como solo queremos datos de las columnas 1 y 8, se utiliza una statement Select Case para especificar qué se escribe en la hoja.


Ejemplo de vista de página web:

Muestra de vista de página


Muestra de código de salida:

Código de salida


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, "