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:
Para aprender un poco mas sobre como extraer información de paginas web, prueba con este otro caso: Buscar definiciones de palabras en la pagina de la RAE
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.
Hola que tal yo solo quiero hacer una macro que busque en google lo que ingrese en una determinada celda de excel, como le puedo hacer? te puedo dejar mi correo? daniel.thewalkingdead@hotmail.com
ResponderEliminarespero puedas ayudarme
Es sencillo:
ResponderEliminarSub navegar()
Dim ie As InternetExplorer
Dim pagina As HTMLDocument
Dim buscar As HTMLButtonElement
Set ie = New InternetExplorer
ie.Visible = True
ie.navigate "https://www.google.com"
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Set pagina = ie.document
Set campo_buscar = pagina.getelementbyid("q")
Set formulario_buscar = pagina.getelementbyid("tsf")
'aqui toma el valor de la celda A1
campo_buscar.Value = ThisWorkbook.Sheets(1).Range("A1").Value
formulario_buscar.submit
End Sub
INCREIBLE! Eres un genio, muchas gracias!!!
ResponderEliminarHola!
ResponderEliminarTe propongo mi problema, me gustaría una Macro VBA que abriera una página web y abriera (no descargar) todos los archivos Excel que hay en ella.
Tengo el código para abrir la pagina web y el código para abrir los archivos .xls pero no sé cómo hacer la unión entre ellos.
Gracias de antemano si pudieras echarme una mano!
Saludos
Hola!
ResponderEliminarTe propongo mi problema, me gustaría una Macro VBA que abriera una página web y abriera (no descargar) todos los archivos Excel que hay en ella.
Tengo el código para abrir la pagina web y el código para abrir los archivos .xls pero no sé cómo hacer la unión entre ellos.
Gracias de antemano si pudieras echarme una mano!
Saludos
Buenas,
ResponderEliminarTengo problemas al momento de activar eventos como onChange en un combobox, mas especifico en combobox dependientes, donde si eligen en uno en el otro se carga la lista. Ejemplo, en uno eliges el país, y en el otro se cargan las ciudades, con el codigo que sugieres si elijo en el primero pero el segundo no carga pues no se activa el evento onChange. Me podrías ayudar de alguna manera a activar ese evento desde vba?
gracias
Hola!!
ResponderEliminarcomo puedo abrir con un botón Clic, una página web e ingresar mi usuario y contraseña. la pagina es http://www.netelip.com/es/log-in-accede-a-tu-cuenta-netelip. le he dado vueltas a lo publicado y no se por donde empezar. Gracias por atenderme.
(Gracias por adelantado)
ResponderEliminarhola!!mi pagina es netelip
ya me funciona pero no soy capaz de cliquear el botón de activar
input type="submit" name="btn-submit" id="btn-submit" class="boton_servicio" value="ACCEDE"
Intenta buscar el id del "form", obtenlo y luego haz form.submit
EliminarHola Buena tarde, disculpa la intromission, estoy hacienda una macro que llena una pagina de mi trabajo y consulta los datos que estan en esa hoja de excel, empieza por un numero de ticket, y luego meteria info, logro acceder a la pagina, pero cuando abre me manda el siguiente error
ResponderEliminarobject variable or with block variable not set
este es mi codigo
Sub navegar()
Dim ie As InternetExplorer
Dim pagina As HTMLDocument
Dim buscar As HTMLButtonElement
Dim direccion As String
Set ie = New InternetExplorer
ie.Visible = True
ie.navigate "http://app.huawei.com/icarenext/#!msr/uwq/cseMySrList.html?para=CseMyHandlingSR"
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Set pagina = ie.document
Set campo_buscar = pagina.getElementById("srSrc-input")
Set formulario_buscar = pagina.getElementById("srSrc-btn")
'aqui toma el valor de la celda A1
campo_buscar.Value = ThisWorkbook.Sheets(1).Range("A1").Value
formulario_buscar.submit
End Sub
me podrias orientar acerca de que podria ser
Veo que el link primero apunta al Uniportal, pudiste hacer login?
EliminarHola,
ResponderEliminarQuiero hacer click sobre un botón "Buscar", que tiene el siguiente código html:
buttton class="intervals_search find" type="submit">
Buscar < / buttton>
Lo he intentado con esto pero no funciona:
ie.document.getElementsByClassName("intervals_search find").Click
¿Alguna idea?
Lo que pasa es que el método getElementsByClassName te devuelve una colección de elementos y no puedes hacer click sobre la colección. Primero tendrías que seleccionar un elemento de esa colección para luego hacerle click.
EliminarIntenta esto: ie.document.getElementsByClassName("intervals_search_find")(0).Click
Al poner el (0) estas seleccionando el primer elemento de la colección, ahí sí puedes hacer click. Avísame si te sirvió.
Gracias Ruben eres un fenomeno, le e dado vueltas y ya me vale.
Eliminarexplorador.document.getElementsByClassName("boton_servicio")(0).Click
Funciona de la misma manera el método getElementsByTagName, es para el mimo caso de dar clic a un boton, saludos.
Eliminarhola Ruben
ResponderEliminarespero puedas ayudarme, realice la macro para entrar a la pagina de telcel http://www.r6.telcel.com/Act/ puedo logearme sin ningun problema, el detalle viene cuando me abre una segunda pagina, ya en el main http://www.r6.telcel.com/Act/main y ya no puedo acceder a los txt ni a los botones, intente ponerle tiempo a que cargue y me tira el error que necesita un objeto mi codigo es este:
Private Sub CommandButton2_Click()
Dim ie As InternetExplorer
Dim pagina As HTMLDocument
Set ie = New InternetExplorer
ie.Visible = True
ie.Navigate "http://www.r6.telcel.com/Act/"
Do
DoEvents
Loop Until ie.ReadyState = READYSTATE_COMPLETE
Set pagina = ie.Document
pagina.All("txtusuario").Value = "ddddd"
Application.Wait (Now + TimeValue("0:00:02"))
pagina.All("txtpassword").Value = "22222222"
Application.Wait (Now + TimeValue("0:00:02"))
pagina.All("Ingresar").Click
stat = pagina.ReadyState
Do While stat = "loading"
Application.Wait (Now + TimeValue("0:00:01"))
stat = pagina.ReadyState
Loop
pagina.All("txtclave").Value = "22222222"
pagina.All("Aceptar").Click
End Sub
mi pregunta es como accedo a los datos de esta segunda pagina emergente, y seguir refrescando la pagina para obtener otros datos, desde ya te agradezco
Hola!
ResponderEliminarestoy tratando de buscar el nombre de textbox donde dice CURP*: osea la casilla donde se llena la curp, pero no encuentro el nombre de esa casilla. https://rfc.siat.sat.gob.mx/PTSC/RFC/menu/index.jsp?opcion=2
Hola Ruben! Estamos tratando de generar un macro que en base a un No. de referencia, en distintas páginas web, nos devuelva el precio que le corresponde de cada página consultada. Crees poder ayudarnos con la macro? Te dejo mi correo en caso de que lo podamos revisar: carol.hdzmtz@gmail.com.
ResponderEliminarMil gracias!!
Hola! muy bueno tu post
ResponderEliminaruna pregunta, cómo hago click en INGRESAR
https://auth.afip.gob.ar/contribuyente_/login.xhtml
Gracias. un saludo
Buenas, Gracias por darme estos conocimientos para progresar en esto de la programación. Por favor ayudenme a sacar la latitud y longitud de esta pagina:
ResponderEliminarhttp://arduexcelweb.net23.net/mapa2.html
tengo que seleccionar un punto y que me bote esos dos datos a excel continuamente, si cambio el punto me debe cambiar el valor de las celdas asignadas
sus id son "loglat" y "loglong"
Estoy seguro que profesionales como ustedes podran hacerlo
Gracias nuevamente de antemano
Mi codigo va algo asi:
ResponderEliminarSub navegar()
'las declaraciones son opcionales, pero ayudan a visualizar las opciones mientras se digita
Dim ie As InternetExplorer
Dim pagina As HTMLDocument
Dim Latitud 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 "http://arduexcelweb.net23.net/mapa2.html"
'espera a que la página cargue
Do While stat = "loading"
Application.Wait (Now + TimeValue("0:00:10"))
stat = pagina.readyState
Loop
'la página cargada la asignamos a la variable "pagina"
Set pagina = ie.document
Set Latitud = pagina.getElementById("loglat")
Latitud.Value = ThisWorkbook.Sheets(1).Range("M2").Value
Set Longitud = pagina.getElementsById("loglong")
Longitud.Value = ThisWorkbook.Sheets(1).Range("M3").Value
End Sub
Amigo, es posible que en vez de manejar IE desde VBA, pueda hacer lo mismo pero con Chrome?
ResponderEliminarInternet Explorer está integrado con VBA, sorry, no conozco como hacerlo con Chrome.
EliminarTe comento que esa fue una de las razones por las que dejé de usar VBA para procesar mis excels, ahora uso Python.
Hola, Muchas gracias por el post, me ha sido de gran ayuda
ResponderEliminarTengo un inconveniente, necesito seleccionar dos valores para realizar una busqueda, pero cuando selecciono uno, se borra el otro, cómo selecciono ambos?
pagina.getElementById("aig_work_teams_advanced").Value = "ea45cdce-0b19-7c04-c575-56313c217492"
pagina.getElementById("aig_work_teams_advanced").Value = "c6c7e679-0678-84a4-2be1-56314334ce98"
Necesito que ambos valores permanezcan asignados, cómo lo hago?
Muchas gracias por tu ayuda
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola, muchas gracias por el post. he usado el codigo para meter la informacón de usuario y contraseña de una pagina. el problema es que no puedo darle al boton de enviar usando tu codigo. creo que el problema radica es que es un formulario y no se cual es el id correcto del boton de validar la información. no se si me puedes ayudar. gracias
ResponderEliminarMuy Buen post si señor,
ResponderEliminarPero me gustaría crear una macro que recorriera todas las páginas de booking.com y me sacara el nombre de los hoteles el numero de estrellas y su ubicación.
Muchas Gracias
muy buen post .. agrego este detalle, si los codigos no dejan el valor requerido en el textbox (en mi caso los textbox eran igual a cero), entonces el código:
ResponderEliminardocumento.getElementById("var").Value = Range("A1").Value
es ineficiente, ya que no rellena la casilla con el valor requerido, si no solo cambia el valor de la casilla internamente, en fin, la solución fue la siguiente (después de 4 días buscando)
For Each abc In IE.Document.getElementsByTagName("input")
If abc.ID = "var" Then
abc.Value = "100"
Hola Cristóbal, me puedes decir un poco más de como funciona el método getElementsByTagName, lo que pasa es que tengo una pagina en la cual quiero hacer clic en un boton, ya lo intente con getElementsByClassName pero resulta que más arriba en la pagina hay un boton que tiene exactamente la misma clase.
EliminarSaludos.
Este comentario ha sido eliminado por el autor.
ResponderEliminarHola a todos,
ResponderEliminarTengo un boton en cual quiero hacer clic y ya lo intente con getElementsByClassName, pero resulta que hay otro boton con la misma clase, entonces hace clic en ese boton y no en el que yo quiero, les dejo el codigo del boton abajo, espero que me puedan ayudar, saludos.
<"input" type="submit" value="Request Price" class="button" onmouseover="checkState()" onclick="event.returnValue=false;(helpState)? getHelp(event,'hlp_601'):event.returnValue=true" style="cursor: help;">
Cambia el índice del elemento. El primero es 0, el segundo 1 y así hasta que encuentres el tuyo.
EliminarSet botón = página.getElementsByClassName("button")(1)
botón.click()
Hola Rubén, muy interesante tu web. Te quería hacer una consulta a ver si podés darme una mano con una macro. Adonde te puedo escribir? Desde ya, muchas gracias. Rodrigo.
ResponderEliminarbuenas tardes, como puedo hacer click sobre una imagen o como puedo mediante tabulador seleccionar la misma para dar enter.
ResponderEliminarHola, una vez que hayas asignado el elemento del botón a una variable, ejecutas el método .Click
EliminarHola Ruben, ando estrujándome los sesos con una web que muestra una tabla con diferentes tabs y quiero activar una de ellas.
ResponderEliminarCada tab esta definida con su propia class así que estaba intentando usar lo que proponías en otros post con los botones de busqueda
pagina.getElementsByClassName("ifmenu-odds li3")(0).Click
pero no funciona =(
alguna idea
hola Ruben . como puedo hacer una macro o con VBA para enlistar en excel los telefónos de mis contactos en Whatsapp ...el link a https://web.whatsapp.com/y de ahi en el lado izquierdo me aparece listado el numero o nombre del contacto que tengo enlazado y tb grupos...mi idea es generar una tabla que me liste los datos de contacto y si pertenece o no a un grupo o es contacto aislado...podrias ayudarme...atte collitamd@yahoo.com.mx
ResponderEliminarhola ruben muchas gracias por tu aportacion! me ayudo demasiado!
ResponderEliminarHola Ruben espero aún estés mirando este post, estoy haciendo una macro para traer los datos dentro de una tabla, pero al ejecutarlo me sale el error "Se ha producido el error '438' en tiempo de ejecución: el objeto no admite esta propiedad o método" el código que estoy usando es
ResponderEliminarSub Eobot()
Dim ie As InternetExplorer
Dim pagina As HTMLDocument
Dim contadorfilas As Long
Dim contadorcolumnas As Long
Set ie = New InternetExplorer
ie.Visible = True
ie.navigate "https://www.eobot.com/login"
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Set pagina = ie.document
With pagina.getElementsByTagName("table")(11)
For contadorfilas = 0 To .Rows.lengt - 1 '<--- donde marca el error
For contadorcolumnas = 0 To .Rows(contadorfilas).Cells.lengt - 1
Sheets(3).Cells(contadorfilas + 1, contadorcolumnas + 1).Value = .Rows(contadorfilas).Cells(contadorcolumnas).innerText
Next
Next
End With
End Sub
Espero puedas ayudarme a solucionarlo
For contadorfilas = 0 To .Rows.lengt - 1 '<--- donde marca el error --- eso es porque no existe la fila 0, empieza por 1.
EliminarFor contadorfilas = 1 To .Rows.lengt - 1 '<--- en la linea siguiente pasa lo mismo.
Hola Ruben, espero aun sigas este post sino pues se intento.
ResponderEliminarTu codigo ne ayudo casi completamente solo que tengo un problema, me di cuenta que una casilla de llenado de la pagina de internet esta con los caracteres ocultos (como si fuera una contraseña), entonces al poner todos los comandos voy inspeccionando todo y se se pone todo pero al momento de llegar al comando de ingresar (.click) se borra únicamente el espacio donde los valores son ocultos.
muchas gracias por esta aportacion, la adapte para ingresar a un portal de mi empresa y funciono, ahora solo la adaptare y que sea estetico en mi dash de control
ResponderEliminargracias
saludos
Hola Rubèn.-
ResponderEliminarEstuve mirando tu blog y, quisiera ver la posibilidad de contratar tus servicios.-
Estoy necesitando una macro en excel, que sea capàz de clikear e ingresar datos en una pàgina web.-
Deberà realizar acciones en la misma, cada vez que el excel arribe a un valor "Verdadero" y otra acciòn diferente cuando se arribe a un valor " Falso".-
Quedo a la espera de tus comentarios.-
Saludos cordiales.-
Raùl Roque - Argentina
Hola, tengo un problema con la extracción de datos de una página web, quiero extraer un texto de una tabla sin id, ni class ni name, que está dentro de un div con id, pero todo está dentro de un frame, envío el xpath completo:
ResponderEliminar//frameset/frame[2]/html/body/div/table/tbody/tr/td/table/tbody/tr[3]/td/div/table/tbody/tr[3]/td/div/table/tbody/tr/td[2]
Gracias.
Hola tengo una macro que funcionaba bien, sin embargo la página a la que estaba ligada cambio y ahora no puedo entrar busco el ID para el botón INGRESAR pero no lo tiene, que puedo hacer
ResponderEliminarHola con todos, desarrolle una macro que entra a una página hace clic en una consulta de usuario y dentro de la página genera una ventana emergen de donde me muestra la información a extraer, como puedo jalar dicha información. actualmente la macro solo jala información de la página principal mas no de la ventana emergente.
ResponderEliminarhola a todos soy inexperto con Excel y vba estoy desarrollando una macro para descargar información solo que la web de donde lo hago tiene paginación y no se como moverme en esa paginación ya descargo la info de la pagina 1 pero quiero ir a la pagina 2 y así descargar toda son aprox 16 paginas y nomas no avanzo en cambiar de pagina
ResponderEliminarles dejo la web de donde quiero dar click bajarla
"https://compranet.hacienda.gob.mx/esop/guest/go/public/opportunity/current?locale=es_MX/""
lo que quiero es saber como moverme entre las paginas con una macro
Private Sub CommandButton2_Click()
' declare the variables
Dim ieObj As InternetExplorer
Dim htmlEle As IHTMLElement
Dim i As Integer
' initialize i to one
i = 1
' create and get access to an instance of IE
Set ieObj = New InternetExplorer
ieObj.Visible = True
ieObj.navigate "https://compranet.hacienda.gob.mx/esop/guest/go/public/opportunity/current?locale=es_MX/""
' give the webpage some time to load all content
Application.Wait Now + TimeValue("00:00:05")
'codigo para ir a la pagina 2
End Sub
he inspeccionado el sitio y creo que es este codigo pero no se como aplicarlo para abrir la pagina 2
este es el dato de la pagina 2
clase="NavBtnPage">2
la linea de codigo estan inclompleta no me deja poner algunas palabras
gracias.
Hola por favor me puedes ayudar conectando una web, que tiene consulta pero lo que necesito es que una vez que la consulta se haya realizado, me pregunte para hacer la importacion de los datos que aparezcan.
ResponderEliminarSub navegar2()
Dim ie As InternetExplorer
Set ie = New InternetExplorer
ie.Visible = True
ie.navigate "https://www.iess.gob.ec/calificacion-web/pages/public/calificacionAtencion.jsf" _
, Destination:=Range("$A$1")
.Name = "calificacionAtencion_2"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = True
.BackgroundQuery = True
.RefreshStyle = xlOverwriteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 1
.WebSelectionType = xlEntirePage
.WebFormatting = xlWebFormattingNone
.WebPreFormattedTextToColumns = True
.WebConsecutiveDelimitersAsOne = True
.WebSingleBlockTextImport = False
.WebDisableDateRecognition = False
.WebDisableRedirections = False
.Refresh BackgroundQuery:=True
End With
End Sub
Este comentario ha sido eliminado por el autor.
ResponderEliminarSaludos Ruben, me encanto tu post.
ResponderEliminarQuisiera saber si es posible enviar teclas después de abrir la página. También quería preguntar si es posible interactuar con javascript, esto porque una de las páginas que abro tiene listas anidadas y por mucho que cambie el item selecto desde vba, no ocurre el evento para que cambie la segunda lista.
¿Se pueden enviar teclas? ¿Cómo el sendKey?
ResponderEliminar