Foros del Web » Programando para Internet » Python »

Crawler

Estas en el tema de Crawler en el foro de Python en Foros del Web. Tienes que hacer un commit después de insertar los datos. @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Python: Ver original cursor = conn. cursor ( ) cursor. executemany ( ...

  #31 (permalink)  
Antiguo 04/03/2011, 09:17
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

Tienes que hacer un commit después de insertar los datos.
Código Python:
Ver original
  1. cursor = conn.cursor()
  2. cursor.executemany("INSERT INTO table (col1, col2) values (%s,%s)", (value1, value2))
  3. cursor.commit()

Link relacionado
  #32 (permalink)  
Antiguo 07/03/2011, 09:20
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

Muy bien razpeitia, esto me sirve para instertar elementos en una base de datos, elementos que yo por ejemplo puedo introducir por teclaro.
Pero lo que quiero es meter los elementos que estan dentro de un archivo.csv
Me explico, tengo un .csv y lo que quiero hacer es recorrer dicho .csv y meter cada elemento separado por ; en una base de datos.
He intentado leer el archivo .csv y meter cada elemento en una lista, luego coger cada elemento de la lista y insertarlo en la base de datos, pero no consigo que funcione.
Alguna sugerencia profavor...
  #33 (permalink)  
Antiguo 07/03/2011, 09:45
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crawler

¿Qué errores estás obteniendo? ¿Cómo ha quedado tu código luego de las sugerencias que te dieron?
  #34 (permalink)  
Antiguo 07/03/2011, 10:45
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

mi codigo despues de los ayudas dadas:


Código Python:
Ver original
  1. import MySQLdb
  2. import csv
  3.  
  4. #establer connexion
  5. db= MySQLdb.connect(host="localhost", user="root", passwd="", db="crawler")
  6. cursor = db.cursor()
  7. #leiendo archivo
  8. camino = 'C:\Documents and Settings\Administrador\Escritorio\crawler_versions'
  9. fichero = '\prova1.csv'
  10. objectivo = camino + fichero
  11. reader = csv.reader(open (objectivo, 'rb'),delimiter=';')
  12.  
  13. raw_input()
  14.  
  15. for index,row in enumerate(reader):
  16.     stmt = "INSERT INTO k_url (id, url) VALUES ('"
  17.     stmt = stmt + str(index + 1)
  18.     stmt = stmt + "', '"
  19.     stmt = stmt + row[0]
  20.     stmt = stmt + ")"
  21.     cursor.execute(stmt)
  22.     print "ia esta"
  23.  
  24. cursor.close ()
  25. db.commit ()
  26. raw_input()

Llega a leer el archivo, despues cuando intento insertar en la base de datos me da el error, no se cual es porque todavia no he debugado el codigo
tengo la base de datos creada, llamada k_url, con dos campos id que es un integer i url que es un vchar...
otra cosa el archivo.csv es separado por filas:
url1
url2
url3
.....
  #35 (permalink)  
Antiguo 07/03/2011, 15:36
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

Antes de llegar a cursor.execute(stmt) haz un print stmt

Veras que te falta una comilla simple
  #36 (permalink)  
Antiguo 08/03/2011, 04:36
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

Muchas graciassssss, esto me pasa por no debugar mi codigo...
ahora que ya puedo insetar listas en una base de datos, sabeis como puedo hacer para que no me inserte repetidos en dicha base de datos,
por ejemplo digamos que tengo el archivo.csv
url1
url2
url3
url3
url1
y yo quiero que en la base de datos no me inserte los repetidos, he intentado tratar el reader de mi codigo como una lista para poder eliminar los repetidos:
Código Python:
Ver original
  1. lista1 = []
  2. for i in reader:
  3.         if i not in lista1:
  4.                 lista1.append(i)
pero da error, me imagino pk el reader no lo puedo tratar como lista, asi que supongo que no me queda otra que al insertar el elemento comprovar si este ya esta en la tabla, pero esto me parece complicado y no tengo ni idea como hacerlo....

sugerencias please...

Última edición por Ricrever; 08/03/2011 a las 04:56
  #37 (permalink)  
Antiguo 08/03/2011, 07:12
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crawler

Sí podés iterar sobre él, así que el error debe estar en otra parte.
Pero el problema de ese método es entre diferentes ejecuciones del mismo programa, podría repetirse una URL que ya esté grabada de antes en la BBDD.
El método "rápido y sucio" puede ser crear un índice de tipo UNIQUE (único) en el campo de la base de datos que contiene la URL, ya que luego al intentar insertar en la BD un registro con la misma URL, la consulta fallará.

Crea el índice en la base (vía phpMyAdmin, u otro gestor de bbdd mysql), y cambia tu código python a algo así:

Código Python:
Ver original
  1. try:
  2.     cursor.execute(....)
  3. except:
  4.     print 'Error al ejecutar la consulta, ya existe un registro con la misma url'

No te recomiendo usar un except vacío, mejor capturar una excepción específica, es solo que ahora no sé qué excepción pueda surgir de ese error de la BBDD. haz algunas pruebas

Saludos.
  #38 (permalink)  
Antiguo 08/03/2011, 18:42
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

Otra cosa que se me no mencione por que estaba apurado, pero que ahora te lo menciono es que no hagas este tipo de cosas:
Código:
"INSERT INTO <table> (col1, col2, ..., coln) VALUES ("+val1+", "+val2+", "+...+", "+valn+")"
Por que puede haber SQL Injection, lo mejor es siempre parametrizar.
Ademas que es difícil de leer.
  #39 (permalink)  
Antiguo 10/03/2011, 05:04
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

Muchas gracias amigos, con gente como vosotros da gusto ir provando cosas y jugar con python!!!

Ahora estoy liado con otra cosa, explico:
en cada posición de la DB tengo una url, lo que quiero es pasar esta url a html y esto pasarlo a un string y guardalo en otra DB donde en cada posición quiero un string con el html de cada url!!
tengo el siguiente codigo:
Código Python:
Ver original
  1. def do_3(self,arg):
  2.         sql = 'SELECT * FROM k_url;'
  3.         cursor.execute(sql)
  4.         resultat = cursor.fetchall()
  5.         for registre in resultat:
  6.             print registre[0]
  7.             sock = urllib.urlopen(registre[0])
  8.             html = sock.read()
  9.             sock.close()
  10.             print html
  11.             raw_input()
  12.             prova = str(html)
  13.             print prova
  14.             raw_input()
  15.             stmt1 = "INSERT INTO htmls (url_id, text_html)VALUES ('"
  16.             stmt1 = stmt1 + registre[0]
  17.             stmt1 = stmt1 + "', '"
  18.             stmt1 = stmt1 + prova
  19.             stmt1 = stmt1 + "')"
  20.             cursor.execute(stmt1)
  21.             raw_input()
  22.            
  23.  
  24.         #cursor.close()
  25.         db.commit()

el error puede estar en pasar la variable con el html a un string.... lo estoy haciendo con el str (linia 12), pero no me funciona
alguna idea????

graciasss

Última edición por Ricrever; 10/03/2011 a las 06:12
  #40 (permalink)  
Antiguo 15/03/2011, 03:39
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

Nadie me puede dar una mano??? es que estoy bloqueado en este error, he debugado el codigo y pasa el html bien a string, pero no encuentra el final del string y salta el error...

alguna ayuda pleaseeeee!!!

graciasss
  #41 (permalink)  
Antiguo 15/03/2011, 06:49
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

Postea que error te arroja.

Ademas muy probablemente tu código fallara por muchísimas causas.
1.- Que pasa si el url no existe
2.- Que pasa si pierdes conexión a Internet
3.- Que pasa si ya existe tal url_id dentro de la tabla htmls
4.- Espero que tengas url_id como clave foránea a k_url
5.- Si el html contiene una comilla simple ' tu query fallara

Así podría seguir pero si no nos dices que error tienes no te podemos decir como solucionarlo.
  #42 (permalink)  
Antiguo 15/03/2011, 07:01
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

Tienes toda la razon razpeitia, pero te respondo:
1.- Estoy haciendo las pruebas con un url que existe
2.- No puedo perder la conexion a Internet donde estoy
3.- En las pruebas que hago solo utilizo un url en la lista
4.- Tengo la url_id como clave foránea.
5.- Este es el error :) al pasar la url a html, dentro del string existen varias comillas simples i por eso me da el error...

sabes si ay algun otro metodo para omitir las comillas simples, o un metodo para pasar el string y que elimine las comillas???

muchas graciassss
  #43 (permalink)  
Antiguo 15/03/2011, 08:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

Ok esta es la tercera vez que lo digo en este post.

Tienes que hacer un
Código Python:
Ver original
  1. cursor.executemany("INSERT INTO htmls (url_id, text_html) values (%s,%s)", (registre[0], prova))

Esto es un query parametrizado, lo que te elimina SQL Injection. Problemas con las comillas simples y muchas otras cosas mas.
  #44 (permalink)  
Antiguo 16/03/2011, 09:36
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

Tienes toda la razon del mundo razpeitia, el otro dia vi que me lo posteavas pero no hice caso, porque no lo entendia...
Gracias por la solución ya me funciona :)
  #45 (permalink)  
Antiguo 17/03/2011, 04:47
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

comunidad, haver quin me ayuda, puedo obtener una columna de una tabla? es decir extraer de una tabla, una columna y meter dicha información a una variable para luego compararlo con otra cosa...

alguien sabe si existe alguna funciona?
  #46 (permalink)  
Antiguo 17/03/2011, 07:22
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

Haz intentado:
Código:
select columna from tabla
Y luego hacer un fetchall ?
  #47 (permalink)  
Antiguo 22/03/2011, 04:16
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

hola de nuevo gente, tengo una pequeña consulta, quien me da una ayuda???
quiero comparar dos cadenas y que me devuelve si hay diferencies entre ellas o no, y si se puede que me indique donde esta las diferencias...
he leido que esta el modulo getopt, pero nose si me cubre mis necesidades... alguna opción?

muchas gracias de antemano!!!
  #48 (permalink)  
Antiguo 22/03/2011, 10:00
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

getopt es para parsear argumentos.

Lo que tu quieres es difflib
  #49 (permalink)  
Antiguo 23/03/2011, 09:15
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

Muchas gracias razpeitia, es lo que buscaba!!!
donde puedo encontrar un ejemplo de como funciona?
por ejemplo tengo dos variables:
var1=('weriuwerr " efkj wq"ñlksjf!"()werjrt (ñrtkt)')
var2=('weriBBBrr " efkj wq"ñlksjf!"()werjrt (ñrtkt)')

me tendria que mostrar por pantalla que hay diferencias y estas son BBB, por ejemplo
resultado=('BBB')

se puede hacer esto en python?
Gracias de antemano!!!!!!!

Última edición por Ricrever; 23/03/2011 a las 09:59
  #50 (permalink)  
Antiguo 23/03/2011, 13:30
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

Deberías de hacer un post por cada duda que tengas, de esa manera ayudas a tener el foro organizado.

Depende de lo quieras, tu algoritmo puede ser tan complejo o sencillo como lo necesites.

La verdad no se que criterios sigas para hacer esta diferencia entre 2 strings en cualquiera de los casos tienes 2 opciones Longest Common Substring o Longest Common Subsequence
  #51 (permalink)  
Antiguo 24/03/2011, 04:50
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

Gracias, tienes toda la razon!!!
voy hacer otro post con una consulta que tengo respecto poder separar archivos en python.
  #52 (permalink)  
Antiguo 13/04/2011, 07:10
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

Hola amigos, ya vulevo a estar por aki con mis consultas.... estoy con el tema de comparar strings, vamos explico:
Tengo una url, la paso a html, dicho html lo paso a un string y lo guardo en un BD.
Luego tengo un scrip que cada x timepo me coge dicha url la pasa a html, luego a string y lo compara con el string que tengo en la BD; lo que quiero es que si encuentra alguna diferencia con el string que tengo guardado que me envie un correo electronico avisandome :P
Puedo hacer un scrip con esto o como lo veis???
  #53 (permalink)  
Antiguo 13/04/2011, 07:41
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

Si, si puedes.
  #54 (permalink)  
Antiguo 19/04/2011, 02:15
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 12 años
Puntos: 0
Respuesta: Crawler

He investigado un poco, y lo puedo hacer con la libreria smtplib, el problema es que hago un pequeño scrip de prueba para ver si me envia un correo y no me funciona....
Código Python:
Ver original
  1. import smtplib
  2.  
  3. receiver = "[email protected]"
  4.  
  5. msg =  "From: %s\n" % sender
  6. msg += "To: %s\n" % receiver
  7. msg += "Subject: Esto es una prueba(email)\n\n"
  8. msg += "funcionara?????????????"
  9.  
  10. server = smtplib.SMTP('smtp.example.org')
  11. server.sendmail(sender, receiver, msg)
  12. server.quit()

Tengo algo mal? o puede ser culpa del proxy o hotmail? alguna sugerencia???

Graciassssss
  #55 (permalink)  
Antiguo 19/04/2011, 10:29
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 17 años, 10 meses
Puntos: 1360
Respuesta: Crawler

Usa libmail para enviar correos.

Si no te lo envía es por que no has añadido las cabeceras adecuadas.

Etiquetas: araña, crawler, spider
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 02:02.