Obtener los enlaces de una web con Python

David Galisteo Cantero

Anuncio:

¡Hola! En esta ocasión veremos como obtener todos los enlaces de una web con Python, y, además, filtrarlos buscando alguna cadena en concreto.

Python nos ofrece gran potencia y versatilidad en pocas líneas, así que crear un script para nuestro propósito va a ser sencillo.

El script que os presento a continuación me sirvió para examinar si una lista de sitios webs (enlaces) tenían contratado un servicio a un producto X.

Me explico mejor, imaginad una web con una lista de empresas, nombre, dirección… etc, y un enlace a su web corporativa, quería saber si estas empresas tenían contratado un servicio X, identificable a partir del atributo “href” de la etiqueta “a” del HTML de su web.

Así que podríamos tomar la url de las webs de esas empresas y examinar sus sitios uno a uno buscando enlaces a este servicio.

import urllib
from lxml import html

url = "http://ejemplo.com/listadoEmpresas.php"
dominio = "ejemplo"
servicio = "servicioX"

urls = []

page = html.fromstring(urllib.urlopen(url).read())

for link in page.xpath("//a"):
  if ".com" in link.get("href") or ".es" in link.get("href"):
    if "@" not in link.get("href"):
      if dominio not in link.get("href"):
          #print "Name", link.text, "URL", link.get("href")
          urls.insert(0,link.get("href"))

for url in urls:
  try:
    print url + "\n"
    pagina = html.fromstring(urllib.urlopen(url).read())
    for enlace in pagina.xpath("//a"):
      if servicio in enlace.get("href"):
        print "La url "+url+" tiene el servicio X"
  except Exception as e:
    print "La url "+url+" no se pudo estudiar"

print "termino"

Lo primero que debemos hacer es importar las librerías ‘urllib’ y ‘html’, esta última de ‘lxml’, en caso de no tenerlas, podemos instalarlas con ‘pip’.

A continuación especificamos la url donde está la lista de las empresas a examinar, y un dominio (sí, también podríamos haberlo sacado automáticamente). Este dominio lo usaremos después para evitar que examine enlaces que llevan a otras partes de la misma web. También especificamos la cadena que identifica el servicio.

Después, en la variable ‘page’ almacenamos el código html de la página. Para continuar, examinamos todos los enlaces, si son ‘.com’ o ‘.es’ (todas las webs eran así), no contienen ‘@‘ (eliminamos enlaces a direcciones de correo), y el dominio no estaba en el enlace (eliminamos enlaces a otras partes de la misma web), podríamos tomarlo como enlace a una web de las empresas que nos interesan, las cuales vamos insertando en un vector.

Se han puesto los if separados para más sencillez, pero podríamos hacerlo en la misma linea.

Ahora ya tenemos la lista de las empresas que nos interesan, toca examinarlas una por una.

El siguiente bucle examina absolutamente todos los enlaces de estas webs corporativas, así, a lo bestia, y busca entre los “href” coincidencias de algunas palabras, en este caso, si tienen contratado un producto, hay una url cuyo «href» contiene la palabra “servicioX” (es una palabra de ejemplo, no es la real). Si hay un enlace que coincide, muestra un mensaje de que la URL X tiene contratado el servicio.

Cabe destacar que se puede «colar» algún enlace que no queramos examinar, es cuestión de estudiar un poco la web y discriminar los enlaces.

Y no hay mucho más que explicar. Si tienes alguna duda solo déjanos un comentario.

Espero que os haya sido útil.

HackSaludos!

Publicado el 09-12-2014

Donar

Si te ha sido de ayuda y quieres hacer una donación te lo agradeceremos :)

Compartelo!


2 comentarios

  • Camilo dice:

    Muy interesante y fácil de entender, solo tengo una pregunta, si quisiera buscar un enlace en especifico que contiene alguna palabra (www.forexample.com) pero al mismo tiempo contiene una variación de la misma (www.forexample1.com) ¿este programa también la selecciona como un resultado?

    • Hola Camilo, en principio sí debería seleccionarlo, ya que estás comprobando si una cadena está dentro de otra con «in».

      De todas formas, para búsquedas más complejas siempre podrías utilizar expresiones regulares.

      Saludos!

Deja un comentario

Comentanos

*

Ir arriba de la pagina