[PYTHON-DUDA] IncompleteRead

Iniciado por O-LLOS-O, 7 Febrero 2010, 21:35 PM

0 Miembros y 1 Visitante están viendo este tema.

O-LLOS-O

Hola, lo siento parece que cada vez que surge un problema, simplemente lo postee, pero no es asi xdxd he buscado y haber no tengo ni idea para empezar pq salta, ha veces sale y haveces no...

Mas que nada pregunto 2 cosas, que es exactamente y pq no me funciona cuando  lo capturo:

Código (python) [Seleccionar]
# -*- coding: utf-8 -*-
from urllib2 import URLError, HTTPError
from httplib import  BadStatusLine, IncompleteRead
import re, urllib2, urllib

lista = []
links_httperror = []
links_urlerror = []
links_badstatusline = []
links_IncompleteRead = []


def web(Ruta, ff, x):
    lista.append(Ruta)
   
    try:
        HTLM = urllib2.urlopen(Ruta)
    except URLError:
        #print '----------------URLError:  ', Ruta
        links_urlerror.append(Ruta)
    except HTTPError:
        #print '----------------HTTPError:  ', Ruta
        links_httperror.append(Ruta)
    except BadStatusLine:
        #print '----------------BadStatusLine: ', Ruta
        links_badstatusline.append(Ruta)
    except IncompleteRead, e:
        links_IncompleteRead.append(Ruta)
    else:

^Tifa^

Hola nuevamente  :D

Desconozco de antemano que estas haciendo, pero que guarda la variable 'Ruta' ????  :huh:  es un Request a una pagina URL???? porque si esto es asi, todo esto:

lista.append(Ruta)
links_urlerror.append(Ruta)
etc...

Estaria mal, ya que si Ruta significa esto:

Ruta = urllib2.Request(pagina)

Estas apuntado a una instancia en una direccion en memoria virtual y no a un valor como tal. Me explico, suponte que pagina es una variable o una url escrita a mano por ti da igual:

pagina = "www.algo.com"
Ruta = urllib2.Request(pagina)

o

Ruta = urllib2.Request('www.url.com')

Recuerda que urllib2 es un modulo y Request un metodo que accepta 1 parametro, en este caso la variable pagina o la direccion url escrita por ti a mano.  Que ocurre que como el parametro es desconocido internamente por el metodo Request, este apuntara a la direccion en memoria donde se encuentre ese valor (la variable pagina o la url escrita por ti a mano), Puedes darte cuenta si haces un :

print urllib2.Request('www.url.com')

Lo cual te retornaria:

<urllib2.Request instance at 0xb7c1974c>

digase que en 0xb7..etc es la direccion en memoria donde esta ubicado el valor de la variable 'pagina' o la url escrita por ti. Por ende como dicho valor hay que buscarlo en memoria ya que literalmente no esta como una constante definida dentro del metodo Request, es normal que esto:

links_urlerror.append(Ruta)

Y similares, te retornasen un mensajito no muy entendible o deseado:

Error ::   [<urllib2.Request instance at 0xb7b9a6cc>]

PD: Que conste que me puedo equivocar en la afirmacion anterior, no es que sea yo muy buena con las definiciones de las cosas. Si dije una tonteria es admisible que cualquiera que entienda de POO me refute  ;)

Ahora, basandonos en lo anterior (Que no se si es correcto que conste). He hecho lo siguiente que a lo mejor te podria servir:

Código (python) [Seleccionar]


from urllib2 import Request, urlopen, URLError, HTTPError
import urllib2

lista = []
links_httperror = []
links_urlerror = []
links_badstatusline = []
links_IncompleteRead = []

pagina = "http://www.googlexx.com"

def web():
  Ruta = urllib2.Request(pagina)
  lista.append(pagina)

  try:
      urllib2.urlopen(Ruta)
  except HTTPError, e:
      links_urlerror.append(e.reason)
      print "ocurrio un error :: "
      print "Error ::  " + str(links_urlerror)
  except URLError, e:
      links_urlerror.append(e.reason)
      print "La UrL " + pagina + " No existe"
      print "Error ::   " + str(links_urlerror)

web()



O-LLOS-O

muchas gracias por responder!!!
jejeje basicamente lo que estoy intentando hacer es un bot que vaya visitando paginas y que en cada pagina me busque a que paginas tiene hipervinculos y que me lo escriva en un txt de esta forma:

http://www.vadewebs.eu/~foment010/alex/:
   :
   :··http://www.ogame.com.es:
   :   :
   :   :··http://www.gameforge.de:
   :
   :··http://www.google.es:
   :
   :··http://www.marca.com:
   :   :
   :   :··http://www.marca.com:
   :   :   :
   :   :   :··http://www.marcaplayer.com:
   :   :   :
   :   :   :··http://www.marca.tv:
   :   :   :
   :   :   :··http://www.radiomarca.com:
   :   :   :   :
   :   :   :   :··http://www.marca.tv:
   :   :   :   :
   :   :   :   :··http://www.veo.es:
   :   :   :   :
   :   :   :   :··http://www.marcamedia.com:

lo hago con una funcion recursiva, y un parametro que indica hasta que nivel quiero llegar, en el ejemplo ese nivel seria 4, aunque esta incompleto ya que es un extracto de un nivel 20, lo que pasa que lo deje parte de ayer por la tarde y toda la noche y por la mañana me encontre que me salto ese error, yo lo que hago es lo siguiente:


La variable Ruta contiene un string con la direccion de la paginam web que voy a abrir, en el ejemplo anterior el primer string que tendria seria:

http://www.vadewebs.eu/~foment010/alex/

pero a mi lo que me interesa es el code fuente de la pagina por lo tanto lo que hago simplemente es poner el code de la siguiente forma:

Código (python) [Seleccionar]
HTLM = urllib2.urlopen(Ruta)

Como ya habras visto, y  con eso ya tengo el code fuente de la pagina en la variable HTML, no utilizo el request, aunque creo que la ara implicitamente

pero el problema con el que me encuentro es que me ha petado el programa en el IncompleteRead, y mira que le he puesto la excepcion, pero no se..., exactamente esta excepcion no se pq salta pero bueno.

Saludos!!!  :rolleyes:


^Tifa^

Mas o menos voy entendiendo.  :P

Sino te molesta claro, me gustaria poder ayudarte mas si me es posible. Solo me estoy basando en el trozo de codigo que colocaste mas no se en su totalidad que estas haciendo. Sino te molestaria colocar el codigo completo aca o si te molesta puedes subirlo a pastebin y enviarme la URL por IM. Y asi intentar llegar a una solucion si aun no la encuentras claro.


Novlucker

Ejem :silbar:

:http://docs.python.org/library/urllib2.html
Citar[...]urllib2.urlopen(url[, data][, timeout])
[...]
This function returns a file-like object with two additional methods[...]

Debes de leerlo:
Código (python) [Seleccionar]
HTLM = urllib2.urlopen(Ruta)
HTMLText = HTML.read()


Por cierto, tu script tiene que ver algo con esto? ;D
http://foro.elhacker.net/ejercicios/juego_ejercicios_python-t278592.0.html;msg1387321#msg1387321

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

O-LLOS-O

#5
realmente no xdxd quiero hacer una emulacion del algoritmo que utiliza google para enseñar paginas web xdxd pero es evidente que a una escala muchisimo menor ya que no tengo tanto potencial, y simplemente que querido empezar por hacer un programa que me vaya buscando paginas de momento es muyyyyy simple no tiene casi nada.

Hver no se hecho nada pero el programa lleva corriendo 24 horas, josto lo puse ayer a las 3, y aun no ha petado.... le pues un maximo de 20 niveles..., justo el extracto que hay en la otra respuesta pero ese extracto es de una ejecucion que duro solo una 9 horas.... asi que no se... de momento seguire investigando y cuando lo mejore un poco te lo paso Tifa, o quien quiera... pero quiza tambien lo utilizo de erramienta para una pagina web que quiero hacer... asi que no se...

Saludos y gracias seguire investigando sobre este error de incompleatread, ya que aun no se pq salta ni como evitarlo

Mercy de nuevo

Novlucker

jaja, creeme que como he dicho en ese mismo ejercicio, el algoritmo de un bot de ese tipo no es muy complicado que digamos, y más en python que nos facilita muchas cosas :P

Ahora, te ha servido lo que te he dicho?

Puede que además del read debas de convertirlo en string con str

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

O-LLOS-O

#7
bah... posteare el codigo que llevo xdxd (Novlucker mientras me contestavas he modificado mi respuesta):

Esto es lo que  llevo que vuelvo a repetir que es ua prueva, para hacer una aplicacion mas correcta y completa...xdxd, ya que esto simplemente me muestra una lista de paginas web empezando por la que querais

Código (python) [Seleccionar]
# -*- coding: utf-8 -*-
from urllib2 import URLError, HTTPError
from httplib import  BadStatusLine, IncompleteRead
import re, urllib2, urllib

listagen = []
lista = []
lista2 = []
links_httperror = []
links_urlerror = []
links_badstatusline = []
links_IncompleteRead = []

def web(Ruta, ff, x):
   listagen.append(Ruta)
   try:
       HTLM = urllib2.urlopen(Ruta)
   except URLError:
       links_urlerror.append(Ruta)
   except HTTPError:
       links_httperror.append(Ruta)
   except BadStatusLine:
       links_badstatusline.append(Ruta)
   except IncompleteRead:
       links_IncompleteRead.append(Ruta)
   else:
       htlm = ""
       for ele in HTLM:
           htlm += ele
       f = re.findall("<a href=\"(http://www[a-zA-Z0-9_ \.:]+[\.com|\.es|\.cat|\.edu|\.tv|\.de])\"",htlm)
       cad2 = "   :"
       cad5 = "\n"
       if x == 0:
           ff.write(Ruta+": \n")
       else:
           ff.write(cad2*x+cad5+cad2*x+"··"+Ruta+": \n")
       x += 1
       if (x <= los niveles que querais no os recomiendo poner un numero muy grande):
           for ele in f:
               if not ele in listagen:
                   lista.append(Ruta)
                   lista2.append(Ruta)
                   web(ele, ff, x)
               else:
                   lista2.append(Ruta)




ff = open("http2.txt", "w")
web("http://www.la pagina que querais", ff, 0)
ff.close()
print 'Pagines webs diferents trovades: \t', len(lista)
print 'Pagines webs visitades (repetides):\t', len(lista2)
print 'Pagines amb errors: '
print 'HTTPError:\t\t\t\t', len(links_httperror)
print 'URLError:\t\t\t\t', len(links_urlerror)
print 'IncompletRead:\t\t\t\t', len(links_IncompleteRead)
print 'BadStatusLine:\t\t\t\t', len(links_badstatusline)



Cita de: Novlucker en  9 Febrero 2010, 14:52 PM
jaja, creeme que como he dicho en ese mismo ejercicio, el algoritmo de un bot de ese tipo no es muy complicado que digamos, y más en python que nos facilita muchas cosas :P

Ahora, te ha servido lo que te he dicho?

Puede que además del read debas de convertirlo en string con str

Saludos


no te lo creeras pero cuando me puse ha hacer esto no tenia ni idea de tu mensage xdxd, esque justo acaba un minicurso de pyhton i me pico hacer cosas de estas, aunque me gustaria tambien saber rellenar formularios para hacer bots que jueguen a juegos, me da igual que me hechen de los juegos es simplemente por hacer una especie de inteligencia... xdxd si supieras de informacion buena me encantaria

Novlucker

#8
A mejorar:
lista y lista2 no cumplen ninguna función que amerite tener una lista en memoria (con el consumo que eso significa). Para lo único que las utilizas es para mostrar un número, entonces por que directamente no utilizar un número (int)?

Me gustas las expresiones regulares, pero si realmente estas buscando links (en cualquier formato) lo suyo sería utilizar la clase HTML.Parser

Sobre lo de los niveles, te has puesto a pensar cuanto son 20 niveles? 20 niveles, suponiendo que en cada nivel hay solo 20 links, 20^19 = 5242.880.000.000.000.000.000.000 links :o , y dado que tienes que hacer un GET a cada página, demorarías menos con esos programas para romper contraseñas a archivos comprimidos :xD
Yo haría que a la hora de navegar hacía otra web, se verifique el dominio para ver si sigue estando dentro del mismo. Es decir, recolectarías todos los links, pero solo navegarías a aquellos pertenecientes a 'este' dominio

[Edito]
Ahora que lo pienso, el número es más grande, porque eso sería lo que hay en el último nivel, pero debes de sumarle los anteriores XD ... ∑ 20^x con x entre 1 y n-1 = 5,51882105263158E+24 (esperemos que me equivoque)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

O-LLOS-O

hay muchisimas cosas ha mejorar, asi a primera vista quiero que me haga un informa queda x tiempo y cada vez que llegue a x numero de enlazes te los deje en un txt con una unformacion adicional determinada.

Muchas gracias por prestarle antecion xdxd mañan le iva a dedicar toda la mañana a mejorar-lo en esos aspectos, pero antes me gustaria preguntar unas cuantas cosas, con ese mismo codigo:

- el incompleteRead me saltava.... no deberia no?,
- Al hacerlo recursivo, no se estan creando copias en memoria de todo este codigo? seria mejor liverar lo maximo la funcion recursiva para que ese proceso no ocupe tanto?
- Crees que seria buena idea añadirle threading para que vaya mas rapido?

En cuanto a lista y lista2 tienes toda la razon... realmente al inicio del todo solo utilizava una lista pero empeze a añadir...

Saludos y mercy de antemano