socket.error: (10061, 'Connection refused')
Adrian Ferreres Esteller
raro82 en hotmail.com
Sab Mayo 21 21:10:58 CEST 2005
Hola lista:
Primero quiero agradecer a todos por los consejos y ayudas que me disteis
con mis problemas con las expresiones regulares. He de decir, con un poco de
verguenza por mi parte, que el problema no lo tenia, precisamente, en
expresiones regulares sino en un nombre mal escrito de una variable. Me
explico:
Yo para compilar las expresiones regulares lo hacia de esta manera:
expr1="<h[1234]>.+</h1[1234]>"
expr2="<th .*>.+</th>"
expr3="<b>.+</b>"
mi_re1=re.compile (expr1)
mi_re2=re.compile (expr2)
mi_re3=re.compile (expr2)
Por eso mi programa me ignoraba las lineas con las etiquetas <b> y me
sacaba dos veces las etiquetas <th>. De todas formas, como muy bien me
explico Hernan Martinez, esta manera de manipular archivos html no es muy
buena y segura asi que tendre que seguir trabajando.
Ahora tengo otro problema que no se por donde pillar, tambien relacionado
con la araña web. Mi araña web final se compone de tres programas:
el downloader.py
el reader.py
el sorter.py
El primero se encarga de bajarse las pagianas web. El segundo se encarga
de leer las paginas web descargadas y obtener los links. Y el tercero se
encarga leer las paginas almacenarlas en la base de datos. Todos los
programas funcionan con hilos y se comunican entre ellos mediante sockets.
El downloader recibe una direccion url de inicio que se le pasa en la linea
de comandos. Una vez almacenada en el disco duro se pasa la ruta de
directorios al reader y al sorter. El reader crea un hilo por pagina que
recibe que se encarga de obtener los links, sacar la direccion url y
enviarlas de nuevo al downloader que a su vez crea un hilo por cada nueva
url. El sorter crea un hilo por cada pagina web descargada y las almacena en
la base de datos.
Pues bien, cada vez que ejecuto el downloader obtengo el siguiente error:
"socket.error: (10061, 'Connection refused')" y la verdad es que no se
porque. Os envio el codigo fuenta del programa a ver si podeis hecharme una
mano. Muchas gracias a todos
import socket
import sys
from string import split
from string import find
import os
import threading
def almacenamiento (path):
direccion=path[0]+"/"
for i in xrange (len(path)-1):
direccion=direccion+path[i]+"/"
if not os.access (direccion,os.F_OK):
os.makedirs (direccion)
if (len(path)==1) or (path[1]=="") :
direccion=direccion+"index.htm"
else:
direccion=direccion+path[len(path)-1]
return direccion
def dir_web (path):
if (len(path)==1) or (path[1]==""):
s= socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect ((path[0], 80))
HTTP_request="GET /index.htm HTTP/1.0\r\n\r\n"
if (s.send(HTTP_request)):
web_add="/index.htm"
else:
web_add="/index.html"
s.close ()
else:
web_add="";
for i in xrange (1,len(path)):
web_add=web_add+"/"+path[i]
return web_add
def download (direccion, web_add, host, port):
print "Descargando del host: ",host
s= socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect ((host,port))
HTTP_request="GET "+web_add+" HTTP/1.0\r\n\r\n"
s.send (HTTP_request)
print "Almacenando pagina en la direccion: ",direccion
fn= open (direccion,'w')
fin_cabecera=False
respuesta=s.recv(1024)
while respuesta:
if fin_cabecera:
fn.write (respuesta)
else:
fin=find (respuesta,"\r\n\r\n")
if fin!=-1:
fn.write (respuesta[fin+4])
fin_cabecera=True
respuesta=s.recv(1024)
s.close ()
fn.close ()
class descarga (threading.Thread):
def __init__ (self,conexion, cliente):
threading.Thread.__init__ (self)
self.conexion=conexion
self.cliente= cliente
def run (self):
path=self.conexion.recv(1024)
path=path[7:]
path=split ('/',path)
self.conexion.close()
direccion= almacenamiento (path)
web_addr=dir_web (path)
download (direccion,web_addr,path[0],80)
s= socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect (("localhost",8080))
s.send (direccion)
s.close ()
s.connect (("localhost",8081))
s.send (direccion)
s.close ()
host="localhost"
port=8080
path= sys.argv[1]
path= path[7:]
path= split (path,'/')
print path[0]
direccion= almacenamiento (path)
web_addr=dir_web (path)
download (direccion,web_addr,path[0],80)
s= socket.socket (socket.AF_INET, socket.SOCK_STREAM)
s.connect ((host,port))
s.send (direccion)
s.close ()
s.connect ((host,8081))
s.send (direccion)
s.close ()
s.bind ((socket.gethostname (), 8082))
s.listen (100)
while (1):
(conexion,cliente)= s.accept ()
print "Se ha conectado otro cliente"
dc= descarga (conexion,cliente)
dc.start()
Más información sobre la lista de distribución Python-es