[Grey-Walter] (pr:topact) resumen 1

NOCREYENTES NOCREYENTES at terra.es
Tue Dec 23 01:43:39 CET 2003


Buenas:

He estado viendo el formato del fichero y parece facil de hacer, pero
¿que es lo que realmente se quiere obtener?

He probado un pequeño caso real (alrededor de 1000 páginas descargadas
desde sindominio.net) y la cantidad de nodos que me salen (enlaces hacia
el exterior) son bastantes (1045) y eso que he tenido bastantes errores
parseando htmls, aunque tb me han dado falos positivos (sindominio.net
como dominio ajeno a www.sindominio.net).

Os paso fichero adjunto donde solo queda generar el fichero. Pero me
gustaría que me dijerais cual de las siguientes opciones os gusta más:

- Todo sindominio.net es representado por un nodo y cada uno de los
servidores externos como otros. (Grano grueso pero más manejable)
- Todo sindominio.net es representado por un nodo y cada pagina externa
como otro nodo.
- Cada pagina con enlaces al exterior de sindominio.net como un nodo y
cada dominio del exterior como un nodo
- Cada pagina con enlaces al exterior de sindominio.net como un nodo y
cada pagina enlazada del exterior como otro nodo (Grano fino pero
muchisimos datos dificiles de manejar)
- Cada pagina de subdominio con o sin enlaces al exterior como un nodo y
cada pagina del exterior como otro nodo. (El grano más fino con el que
se puede estudiar el sistema, pero tan fino que no creo que se pudiera
procesar en un tiempo razonable los datos)

Espero ideas para poder dar por completado el primer esbozo de topact
(después se podrían hacer optimizaciones y mejoras sobre esta primera
iteracion).

Para hacer correr una prueba es necesario correr primero el HTTrack y
despues se ejecuta el script pasando el fichero de log generado como
parametro. Se puede usar cualquier pagina aunque no sea de
sindominio.com (ej: una web local), de esta forma no es necesario
descargarse sindominio.net (y si lo intentais paradlo a tiempo ;-))

Un saludo:

Javi


----- Mensaje Original -----
De: "Juan J. Merelo" Guervós <jmerelo at geneura.ugr.es>
Fecha: Jueves, Diciembre 18, 2003 8:39 pm
Asunto: Re: [Grey-Walter] (pr:topact) resumen 1

> Hola,
> 
> 
> > Fernando, JJ, nos podeis aconsejar? algun archivo de ejemplo?
> 
> Con visone se usan matrices del tipo
>    a b c d...
> a   x x x x
> b   x x x x
> ...
> 
> Así sucesivamente. Luego, de visone puedes exportar formato .dl, 
> que es
> el que maneja Pajel y UCINET.
> 
> JJ
> 
> 

-------------- next part --------------
#!/bin/env python
from HTMLParser import HTMLParser, HTMLParseError
from os import sys
import re

"""
Clase para sacar los links tipo <a href=...>...</a> de un html.
"""
class LinksParser(HTMLParser):
        pagina='' #El nombre de la pagina que estamos parseando
        enlaces=[] #Los enlaces que contiene la pagina
        enA=0 #Flag para saber si estamos procesando un fichero
        
        tmp_enlace=''
        tmp_data=''
        def handle_starttag(self,tag, attrs):
                if str(tag)=='a':
                        self.enA=1
                        for clave, valor in attrs:
                                if clave=='href':
                                        self.tmp_enlace=valor
                else:
                        self.enA=0
        def handle_data(self, data):
                if self.enA:
                        self.tmp_data=data
        def handle_endtag(self, tag):
                if tag=='a':
                        self.enA=0
                        self.enlaces.append((self.tmp_enlace,self.tmp_data.strip()))
        def procesa(self, fichero):
                self.pagina=fichero
                self.enlaces=[]
                f=open(fichero,'r')
                for i in f.readlines():
                        self.feed(i)
                self.close()
                
"""
Clase para parser el log de descarga del HTTrack. Se obtiene un hash con los enlaces que han sido descargados.
"""
class HTTrackLogParser:
        enlaces={} #imaginario:real
        contador=0
        def __init__(self, fichero):
                reLog=re.compile("(?P<fecha>[0-9]{2}:[0-9]{2}:[0-9]{2}).*Info:.*link added:\ (?P<url_real>[^\ ]*)\ ->\ (?P<url_local>[^\ \r\n]*)")
                f=open(fichero,"r")
                for line in f.readlines():
                        lineaLog=reLog.search(line)
                        if lineaLog != None:
                                self.enlaces[lineaLog.group("url_local")]=lineaLog.group("url_real")
                                self.contador=self.contador+1
                                
"""
Esta es una clase para parsear las urls. A dia de hoy es muy cutre, pero tiempo hay de hacerla bonita.
"""
class URLParser:
        def __init__(self):
                self.re_externa=re.compile("external.html\?link=(?P<link>.*)")
        def es_externo(self,url):
                resultado=self.re_externa.search(str(url))
                if resultado:
                        return resultado.group("link")
                return None
                        
        
print "Preparando fichero de log"
ht_parser=HTTrackLogParser(sys.argv[1])
url_parser=URLParser()
print "Fichero de log procesado.", ht_parser.contador, "ficheros descargados."
origen_destinos={}
nodos=[]
contador=0
for url_local, url_real in ht_parser.enlaces.items():
        #print contador*100/ht_parser.contador,"%"
        try:
                f=open(url_local,"r")
                html_parser=LinksParser()
                html_parser.procesa(url_local)
                for enlace,texto in html_parser.enlaces:
                        link=url_parser.es_externo(enlace)
                        if link:
                                origen=None
                                if origen_destinos.has_key(url_real):
                                        origen=origen_destinos[url_real]
                                else:
                                        origen=[]
                                        origen_destinos[url_real]=origen
                                if link not in origen:
                                        origen.append(link)
                                
                                if url_real not in nodos:
                                        nodos.append(url_real)
                                if link not in nodos:
                                        nodos.append(link)
                                        contador=contador+1
        except HTMLParseError, e:
                print "Error", e,"en el fichero",url_local
        except IOError, e:
                print "Error",e,"de E/S"
        except:
                print "Unexpected error:", sys.exc_info()
                raise
                #print "Error en el fichero:",url_local
for origen, destinos in origen_destinos.iteritems():
        print ""
        print ""
        print origen,destinos
print contador


More information about the Grey-Walter mailing list