Cargando



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.


jun 26 2016 12:22
Avanzado
jun 26 2016 18:31

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.

 

scraping.jpg

 

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:

 

Fichero Adjunto  RecorrerEnlaces.zip   646 bytes   634 Descargas


¿Te ayudó este Tutorial?


2 Comentarios

Genial, gracias

Una pregunta se puede hacer un script que al momento de que alguien abra una pagina web me lo notifique!?(ejemplo: que yo vaya a abrir youtube y que al momento de abrir youtube me llegue un mensaje que acabo de abrir esa pagina) por favor se que es viejo el tema pero necesito saber esto lo mas pronto posible.! de antemano gracias
No esperes más y entra en Solvetic
Deja tus comentarios y aprovecha las ventajas de la cuenta de usuario ¡Únete!

X