domingo, 20 de junio de 2010

pyCrawler 0.2

Pues hay actualizacion del pyCrawler, los cambios son bastante significativos... y lo que es mas importante, ahora hace algo util! :D

El motivo fue que ultimamente aprovechaba el codigo del primer pyCrawler para los scripts que usasen la web, pero no es que sea un codigo muy pythonico (de hecho es bastante malo y tiene algunos bugs), asi que aproveche para reescribirlo desde cero... no le doy mas vueltas:

- Pasa de ser un script a ser mas bien una libreria
- Pasa de administrar las conexiones a mano (con sockets) a hacerlo con urllib, que es estandar, y lo hace mucho mejor
- Se limpio el codigo para hacerlo mas comprensible

Se puede descargar aqui [pycrawler.zip]

El uso es bastante sencillo (o eso se intento), solo hay que importarlo

from pycrawler import *

y crear un objeto (solo es necesario uno), el unico argumento (opcional) es el de proxies, si no se especifica se usara el del sistema, la forma de definirlo es como los de urllib (que es la libreria que se ocupa de esa parte)

c = crawler()

Despues, solo hay que llamar al la funcion crawlsite, con una url

site = c.crawlsite(url)

la variable que se devuelve tiene una sola propiedad (en posteriores versiones habra mas), element_list, que como su nombre indica es una lista de elementos. Cada uno es un elemento de la web, las propiedades que tienen son

  • tag (booleano), indica si es una etiqueta o si es solo texto
  • tag_type (string), el tipo de etiqueta que es ("body", "head", "a",... )
  • property (diccionario), las propiedades de la etiqueta (si tiene), se accede a ellas a traves de su nombre
  • closing (booleano), si es una etiqueta de cierre
  • closed (booleano), si es una etiqueta que se cierra (como <br> )
  • commented (booleano), si esta comentado

Ademas los enlaces ( tag_type == "a" ), tienen las propiedades:

  • absolute (string), url absoluta a donde enlazan
  • range (string), si es local ("local"), externa ("external") o si es javascript ("javascript")

Eso es todo lo que tiene. Asi por ejemplo, este codigo exploraria un website completo:


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from pycrawler import *
c = crawler()

newlist = []
inicio = raw_input('Introduce la url por la que se comenzara: ')
newlist.append(inicio)

mylist = []

# Mientras queden paginas por explorar
while len(newlist) > 0:

    # La nueva pagina se mueve a la lista de las ya exploradas
    this = newlist.pop(0)
    mylist.append(this)

    print this,"..."

    # Se explora
    site = c.crawlsite(this)

    # Se lee la lista de links locales
    for e in site.element_list:

        if (e.tag_type == "a"):
            if (e.range == "local"):

                # Sino se vio antes, se añade a la lista
                if not(e.absolute in mylist) and not(e.absolute in newlist):

                    newlist.append(e.absolute)

print "Mostrando lista (",len(mylist) ,"):"

print mylist



Hasta otra

Actualizacion: acabo de subir una version con los fallos que encontre corregidos (no cai en los "./" y "../" de las url, mal empezamos xD), el enlace es el mismo, [pycrawler.zip]

No hay comentarios:

Publicar un comentario