Web scraping – Obteniendo la temperatura de los próximos días

Estándar

En esta ocasión vamos a extraer la temperatura de un portal de internet, de la siguiente página: openweathermap.org/city/3530597 que muestra la temperatura de los próximos días de la ciudad de México.

Para efectuar esta tarea haremos uso del objeto Internet Explorer para poder navegar a dicha página y una vez cargada la misma empezamos a realizar la extracción del texto correspondiente y lo vaciamos en las celdas de nuestro libro.

Antes que nada tendremos que agregar la referencia necesaria para trabajar con el navegador de la siguiente forma:

001

Una vez agregada la referencia correspondiente podemos hacer uso las propiedades y métodos del objeto IE y tener la ventaja del intellisense al codificar con el objeto, después de ello procedemos a escribir el siguiente código:


Sub Clima()
Dim oIE As InternetExplorer
Dim sContenido As String
Dim lPosicion As Long
Dim vContenido As Variant
Dim i As Integer
Set oIE = New InternetExplorer 'aqui se crea y se ejecuta una instancia del navegador
With oIE
.Visible = True 'con esta instruccion hacemos visible el navegador
.Navigate "http://openweathermap.org/city/3530597"
'esperamos hasta que se haya cargado la pagina en el navegador
While .ReadyState <> READYSTATE_COMPLETE: DoEvents: Wend
sContenido = .Document.body.innertext 'se almacenatodo el texto desplegado por la pagina
'vemos que la cadena "next days" solo aparece una vez en el texto de la pagina y de ahi en adelante viene la
'temperatura de los dias siguiente...
lPosicion = InStr(1, sContenido, "Next Days", vbTextCompare) 'encontramos su posicion
sContenido = Mid(sContenido, lPosicion + Len("Next Days"), 1000) 'cortamos la cadena
vContenido = Split(sContenido, vbNewLine) 'spliteamos por linea de texto
'procesamos cada linea de texto, vemos que las lineas que nos interesan tienen una ma longitud menor a
'40 caracteres (a ojo de buen cubero)
For i = LBound(vContenido) To UBound(vContenido)
If Len(vContenido(i)) > 0 And Len(vContenido(i)) < 40 Then
Range("A65500").End(xlUp).Offset(1, 0) = vContenido(i) 'escribos la info en nuestra hoja de excel
End If
Next
.Offline = False
.Quit 'cerramos el navegador para que no cnsuma memoria
MsgBox "Temperaturas extraidas con éxito", vbInformation
End With
Set oIE = Nothing
End Sub

Aquí comparto la macro con el código de ejemplo.