Internet Explorer.Aplicación para VBA

Hace algunos días me han pedido que tome algunos datos de muchas páginas de un sitio web y los coloque en un archivo de Excel para trabajar con ellos como una lista normal de registros. Aquí es mi solución a este problema que se puede aplicar en varios otros casos y que explica la potencialidad de Internetexplorer. Biblioteca de aplicación para VBA.

En primer lugar, definamos el problema que tuve que resolver:
Crear una lista detallada de personas de un sitio web donde el enlace a la página de cada persona era un comando JavaScript.

Primera consideración: el tipo de enlaces proporcionados por el sitio no podía permitir descargar con una herramienta web todas las páginas que comienzan de una página de inicio.

No se puede descargar todas las páginas y abrirlas como archivos de texto que buscan la información necesaria que pensé sobre una solución diferente: cree una aplicación VBA en MS Excel Ables para navegar por sí mismo todo Sitio web y Ables para leer el HTML de cada página necesario.

Por lo tanto, como primer paso tuve que crear un objeto de Internet. Aplicación para inicializar una sesión de Internet Explorer. Esta operación se puede realizar mediante las siguientes instrucciones:

dim objie como objeto
establecer objie = createObject (“Internetexplorer.application”)

Una vez que iniciamos Internet Explorer, está arriba a nosotros mostrar la aplicación o no. Podemos usar la propiedad visible asociada al objeto de esta manera:

objie.visible = true ‘veremos la navegación de la ventana
objie.visible = false’ la ventana de IE no es visible < /P>

Después de esta configuración muy rápida tuve que comenzar a abrir la página inicial que contiene todos los enlaces necesarios para tomar la información correcta. Para abrir un enlace, podemos usar el siguiente método:

objie.navigate “http://www.website.com”

es decir, a veces puede requerir una página web, por lo tanto, esto La operación debe ser seguida por algún bucle para esperar hasta que tengamos la página abierta:

mientras objie.busy
doevents
wend

En mi caso siempre tuve una página Contiene varios enlaces a páginas web personales y solo de estas páginas web personales de las que podría tomar los datos. Por lo tanto, el siguiente paso fue navegar por todos los enlaces de la página inicial y acceder a ellos uno por uno:

READ  Piezas de tractores de césped Sears

para cada LNK en objie.document.links
‘Código de bucle
Siguiente lnk
La propiedad objie.document.links contiene todas las etiquetas de una página web en un formulario de matriz. Por supuesto, no todos los enlaces en la página web son útiles para nuestro propósito, por lo tanto, necesitamos encontrar si hay algo que nos haga reconocer fácilmente los correctos. En mi caso, fue fácil, cada enlace que contenía JavaScript Word era un enlace a una página personal. Por lo tanto, busqué los enlaces correctos usando un string funciones como Instr para saber si navega por el enlace o no. Quizás haya muchas formas de usar para definir los enlaces que necesita abrir, depende de usted y para el diseño del sitio web. El bucle será así:

para cada LNK en objie.document.links
if (instr (lnk, “alguna cadena de etiqueta”)) entonces
‘código que se ejecutará en Caso Es un buen enlace
FIN IF
SIGUIENTE LNK

Para abrir todos los subcontrates, utilicé un objeto de aplicación de Internet adicional para realizar un seguimiento de los enlaces que ya había visitado sin mantener cualquier índice al respecto. Esta solución me evitó a surfear nuevamente la matriz para encontrar la posición correcta y dejar que el siguiente bucle inicie y finalice sin ningún bucle vacío adicional. Entonces, piense que existen otro objeto de aplicación de Internet. Al principio se inicializa como objie y eso significa que ha abierto la misma página web.

A medida que avanzamos a través de todo el enlace de la página principal y ambos objetos están en la misma página que podemos asumir que la estructura de la página HTML es la misma en ambos. Por lo tanto, si agregamos estas líneas al siguiente bucle para cada siguiente bucle, tendremos el LNK abierto sin perder la lista de enlaces desde la página original.

para cada LNK en objie.document.links
if ( Instrer (lnk, “alguna cadena de etiqueta”)) entonces
objiepage.navigate lnk
end if
next lnk

READ  Lista de empresas MLM M - Z

objiePage ahora muestra la página web personal de la que tomamos los datos de. Como ya se ha visto, es mejor esperar hasta que la página esté completamente cargada. Entonces, la siguiente versión del bucle es la siguiente.

para cada LNK en objie.document.links
if (instr (lnk, “algunas cadenas de etiqueta”)) luego
objiepage.navate lnk
mientras objiepage.busy
doevents
wend
end if
próxima lnk
Una vez que terminemos la primera ejecución de este bucle navegando por un buen enlace, no podremos abrir un Nuevo enlace en objiepage object porque ya no está en la misma página de Objie. Por lo tanto, después de ver cada buena página, tenemos que volver a la página anterior. Para esto podemos usar el método .goback o nuevamente el .navate uno para abrir la misma página de inicio. Veamos el nuevo código que agrega uno de ellos.

para cada LNK en objie.document.links

if (instrer (lnk, “alguna cadena de etiqueta”)) entonces </p >

objiepage.navigate lnk
mientras objiepage.busy
doevents
wend

objiepage.goback
mientras obkiepage.busy
Doevents
Wend FIN IF
Siguiente lnk

Si ejecutaríamos este cicle desde el principio hasta el final, podríamos navegar todas las páginas personales. Ahora veamos cómo recuperar algunos datos. En primer lugar, presentemos la propiedad que contiene el código HTML del cuerpo:
objiepage.document.body.innerhtml
Utilizando funciones de cadena en el contenido de esta propiedad, podemos identificar dónde se encuentra la información que estamos buscando. Veamos solo un ejemplo porque, por supuesto, cada situación es diferente y requiere ser administrada en función de lo que tenemos en el código HTML como etiqueta y como información.

. En mi caso, podría obtener el nombre de la persona Basado en la ID de la etiqueta que contiene el nombre. Entonces …
pos = instr (objiepage.document.body.innerhtml, “_ctl0_lblfirmName”)
start_pos = pos + 18
s = mid (objiepage.document.body.innerhtml, start_pos, 100)
end_pos = instr (s, “span”) – 3
sheet2.range (“a” & j) .value = mid (s, 1, end_pos)

Entonces en pos i almacenó la posición del primer char de _ctl0_lblfirmName. Desafortunadamente, el nombre en sí no estaba bien después de esta palabra, por lo tanto, tuve que calcular a mano cuántos caracteres tenía que evitar leer desde POS. En este caso, tenían 18. Debido a que Instr aceptaría solo un intercambio como posición inicial, tuve que tomar una longitud estándar de la cadena que comenzó desde Start_Pos para poder encontrar la longitud exacta del nombre y usar la función de cadena media para obtenerla Volver y guardarlo. Entonces, en S almacené una cadena de 100 caracteres que comienzan con la primera letra del nombre y terminan con cualquier otra cosa. En End_Pos, busqué el final de la etiqueta que encerró el nombre y resté algunos caracteres que no eran parte del nombre. Como la última, almacené en la celda de Excel, el nombre contenido en la variable de cadena S que comienza al comienzo de la cadena y los caracteres largos end_pos. Solo para este artículo, escribo aquí algún código utilizando estas funciones para recuperar algunos datos de la página web.

READ  Cómo preservar un periódico

para cada LNK en objie.document.links

if (instrer (lnk , “Some Tag String”)) entonces

objiepage.navate lnk
mientras objiepage.busy
doevents
wend

pos = instrer (objiepage.document. Body.innerhtml, “Etiqueta o cadena precediendo los datos que queremos”)
start_pos = pos + 18
s = mid (objiePage.document.body.innerhtml, start_pos, 100)
end_pos = instrer , “Etiqueta o cadena siguiendo los datos que queremos”) – 3
msgbox (“El nombre de la persona es” & Mid (s, 1, end_pos))

objiepage.goback
Mientras que obkiepage.busy
doevents
wend
end if

Next lnk

Una vez que este bucle finalice, todos los datos se tomarán correctamente de cada página web. Todo lo que queda es para el objeto IE creado y liberar las variables.

objie.quit
objiepage.quit
set objie = nada
set objiePage = nada

referencia: