Ver destacados

Cómo rastrear enlaces en una web utilizando Python

En este tutorial aprenderás a realizar web scraping y recorrer los enlaces que tiene una web utilizando Python de forma fácil y rápida.
Escrito por
15.3K Visitas  |  Publicado jun 26 2016 12:22
Favorito
Compartir
Comparte esta pagina a tus Amigos y Contactos usando las siguientes Redes Sociales


Hoy voy a enseñarte a recorrer los enlaces de una página con Python (web scraping), esto puede ser muy útil para rastrear contenidos en una web de manera automática y no tener que hacerlo a mano. En el programa que traigo se obtiene cada enlace leyendo el html, podrías modificar el programa para buscar un cierto contenido y mostrar solo los enlaces en los que estás interesado.

 

También puedes hacer web scraping utilizando el fichero robots.txt o los sitemaps que tienen los sitios webs.

 

Nota
El código que se muestra funciona en Python 3.x, si lo quieres hacer correr en la versión 2.x tendrás que hacer pequeñas modificaciones.

 

A continuación os dejo el código:

import queue
import urllib.request
import re
from urllib.parse import urljoin

def descargar(pagina):
    try:
        peticion = urllib.request.Request(pagina)  
        html = urllib.request.urlopen(peticion).read()
        print("[*] Descarga OK >>", pagina)
    except:
        print('[!] Error descargando',pagina)
        return None
        
    return html
    

def rastrearEnlaces(pagina):
    buscaEnlaces = re.compile('<a[^>]+href=["'](.*?)["']', re.IGNORECASE)
    cola = queue.Queue()
    cola.put(pagina) 
    visitados = [pagina]
    print("Buscando enlaces en",pagina)
    while (cola.qsize() > 0):
        html = descargar(cola.get())
        if html == None:
            continue
        enlaces = buscaEnlaces.findall(str(html))
        for enlace in enlaces:
            enlace = urljoin(pagina, str(enlace))
            if(enlace not in visitados):
                cola.put(enlace)
                visitados.append(enlace)

  
if __name__ == "__main__":           
    rastrearEnlaces("http://www.solvetic.com")
Lo primero que hacemos es importar las librerías necesarias, para las expresiones regulares (re), para usar la cola (queue), para hacer peticiones y leer una página (urllib.request) y para la construcción de URLs absolutas a partir de una URL base y otra URL (urljoin).

 

Código dividido en 2 funciones

descargar
Nos sirve para descargar el html de una página. No necesita mucha explicación lo único que hace es una petición a la página deseada, lee su html, si todo va bien muestra un mensaje de Descarga OK, y si no muestra que hubo un error (Aquí podiamos mostrar información del error), al final devuelve el html leido o None.

rastrearEnlaces
Es la función principal y recorrerá cada enlace. Vamos a explicarla un poco:
  • Creamos una variable con una expresión regular, que nos sirve para encontrar los enlaces en el html.
  • Iniciamos una variable de tipo cola con la página inicial, nos servirá para ir guardando los enlaces en el “orden” que los descubrimos. También iniciamos una variable de tipo lista llamada visitados que utilizaremos para guardar los enlaces según se visiten, esto se hace así par evitar un bucle infinito, imaginar que una la página x referencia a la página y, y ésta a su vez a la página x, todo el rato insertaremos estos enlaces sin fin.
  • El núcleo de la función es el bucle while, que se irá ejecutando mientras que la cola tenga enlaces, por eso comprobamos que el tamaó sea mayor a 0. En cada pasada sacamos un enlace de la cola y se lo mandamos a la función descargar, que nos devolvera el html, acto seguido buscamos los enlaces, y comprobamos si ya lo hemos visitado, si no es así lo agregamos a la cola y a la lista.

 

Nota
Puede parecer que la lista sobra, pero de la cola vamos a ir sacando y borrando los enlaces, por lo que la comprobación no sería correcta, a lo mejor el enlace le visitamos hace rato y ya no está en la cola, pero si estará en la lista.


 

La última parte del código ya fuera de las funciones se encargará de ejecutar el código. En la siguiente imagen puedes ver una captura del código en ejecución, rastreando a solvetic.

 

 

Si quieres puedes ayudarte de una librería que existe para python llamada BeautifulSoup, te va a parecer muy fácil de manejar, yo la recomiento.

 

Por si quieres el código, a continuación te dejo un zip:

 

RecorrerEnlaces.zip   646 bytes   637 Descargas

¿Te ayudó este Tutorial?

Ayuda a mejorar este Tutorial!
¿Quieres ayudarnos a mejorar este tutorial más? Puedes enviar tu Revisión con los cambios que considere útiles. Ya hay 0 usuario que han contribuido en este tutorial al enviar sus Revisiones. ¡Puedes ser el próximo!