Hace poco mas de un año escribí un
post sobre como abrir una pagina web desde excel, pero viéndolo bien, estába un poco complicado. Así que decidí hacer una nueva publicación un poco mas didáctica y fácil de reproducir por cualquiera que desee intentarlo.
Esta macro entra al sitio web de
Airbnb y extrae los precios que se despliegan en la primera página de resultados. Las técnicas que se utilizan en este ejemplo pueden servir para que cada uno las aplique a algun otro tipo de investigación para su trabajo o estudio.
Comenzamos con un archivo en el cual ingreso una ciudad, fecha de check in, fecha de salida y número de huéspedes. Las celdas de fecha tienen formato de texto para que coincida con el formato que exige la página.
Antes de escribir el código, debemos incluir las librerías que nos permiten acceder a los controles de internet que vamos a utilizar, eso lo hacemos en el editor de visual basic, en tools/references. Allí seleccionamos las opciones que vemos a continuación (Microsoft Internet Controls y Microsoft HTML Object Library):
Ahora sí comenzamos a escribir la macro:
Sub navegar()
'las declaraciones son opcionales, pero ayudan a visualizar las opciones mientras se digita
Dim ie As InternetExplorer
Dim pagina As HTMLDocument
Dim buscar As HTMLButtonElement
Dim precios As Object
Dim precio As Object
'crea el explorador de internet
Set ie = New InternetExplorer
'hacemos visible el explorador
ie.Visible = True
'navega a la página de aribnb
ie.navigate "https://www.airbnb.com/"
'espera a que la página cargue
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
'la página cargada la asignamos a la variable "pagina"
Set pagina = ie.document
Interrumpo el código para explicar algo: Para ir llenando los campos que pide la página, con hacer click en el boton derecho e "inspeccionar elemento" podemos identificar los nombres de cada campo:
El campo de la ciudad, que se llama "location":
El campo para la fecha de check in, se llama "checkin":
El campo de check out es "checkout":
La lista de huéspedes, tiene un id ("guests") y a su vez varias opciones dentro de si:
Y el botón de enviar, que tiene el id "submit_location":
Ahora que ya sabemos como ubicarlos, procedemos a pasarles valores los cuales tomamos del libro de excel:
'asignamos el valor de una ciudad
pagina.getElementById("location").Value = Range("B1").Value
'esperamos un segundo para que puedas visualizar los cambios que estas realizando
Application.Wait (Now + TimeValue("0:00:02"))
'pasamos a "checkin" la fecha de ingreso
pagina.getElementById("checkin").Value = Range("B2").Value
Application.Wait (Now + TimeValue("0:00:02"))
'pasamos la fecha de check out
pagina.getElementById("checkout").Value = Range("B3").Value
Application.Wait (Now + TimeValue("0:00:02"))
'pasamos el "value" que nos interesa a la lista "guests"
pagina.getElementById("guests").Value = Range("B4").Value
Application.Wait (Now + TimeValue("0:00:02"))
'seleccionamos el botón de buscar y hacemos click
pagina.getElementById("submit_location").Click
'asignamos a una variable el estado de la página
stat = pagina.readyState
'Espera a que la página cargue
Do While stat = "loading"
Application.Wait (Now + TimeValue("0:00:01"))
stat = pagina.readyState
Loop
En la página siguiente vemos los precios de todas las habitaciones, lo que nos interesa es el valor del elemento que contiene la suma en dólares.
Como queremos todos los precios, hay que buscar la manera de recogerlos todos. Vemos que el elemento no tiene un "id", pero todos tienen en común un nombre de "class". Con el método getElementsByClassName, buscamos ese nombre de clase y así obtendremos una colección de todos los campos:
'creamos la lista de precios
Set precios = pagina.getElementsByClassName("h3 text-contrast price-amount")
'comenzaremos a llenar el excel en la fila 7
fila = 7
'hacemos un loop por cada elemento de la lista de precios y lo agregamos al excel:
For Each precio In precios
Range("A" & fila).Value = precio.innerText
fila = fila + 1
Next
End Sub
Y listo, este es el resultado final:
Cada pagina web es diferente, si la macro no funciona como esperabas,
enviame un mail y si no es muy complicado el asunto quizás pueda darte una ayuda extra.