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