Foros del Web » Programando para Internet » Python »

Crawler

Estas en el tema de Crawler en el foro de Python en Foros del Web. Hola gente, estoy trabajando en un tema bastante interesante, se trata de capturar imágenes de un dominio. Con un scrip he conseguido convertir la pagina ...

  #1 (permalink)  
Antiguo 11/02/2011, 05:17
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Crawler

Hola gente, estoy trabajando en un tema bastante interesante, se trata de capturar imágenes de un dominio.
Con un scrip he conseguido convertir la pagina web en un archivo .html y guardarlo en una variable, ahora se trata de recorrer dicha variable y encontrar las imágenes y guardarlas en un archivo, pero no tengo ni idea de cómo realizar esto, me han dicho que existe la librería httplib para hacer peticiones http, pero nose si voy por buen camino.

Me gustaría mucho leer vuestras opiniones, ya que me han dicho que hay gente muy buena por aquí ;)


graciassss de antemano!!!!
  #2 (permalink)  
Antiguo 11/02/2011, 09:23
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Crawler

Busca todas las etiquetas img dentro del archivo .html

Recomendaciones usar lxml o BeautifulSoup
  #3 (permalink)  
Antiguo 14/02/2011, 05:30
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crawler

+1 a BeautifulSoup. Una vez que tengas el HTML en una variable, digamos que se llama "html", podés hacer esto:

Código Python:
Ver original
  1. bs = BeautifulSoup(html)
  2. bs.img
donde bs.img es una lista de todas las imágenes del documento. Fijate en la documentación:
http://www.crummy.com/software/Beaut...ing%20HTML


Saludos.
  #4 (permalink)  
Antiguo 14/02/2011, 10:34
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

gracias por interesaros por mi tema, entieno que el Beautiful Soup es el mejor metodo para encontrar las imagenes, pero como hago para instalarlo? hago un import Beautiful? o tengo de descargar algun archivo i guardarlo en site-package ??? ayuda con este modulo por favor!!!!
graciassssss amigos!!!!!

Última edición por Ricrever; 14/02/2011 a las 10:49
  #5 (permalink)  
Antiguo 14/02/2011, 10:52
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Crawler

Te bajas el código aquí.
Lo descomprimes, abres la consola y haces un:
Código:
python setup.py install
(Suponiendo que python esta en tu path y obivia donde tengas los archivos del BeautifulSoup)
  #6 (permalink)  
Antiguo 14/02/2011, 11:09
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crawler

No olvides easy_install o pip

Código Python:
Ver original
  1. pip install BeautifulSoup
o
Código Python:
Ver original
  1. easy_install BeautifulSoup
Ambos comandos son más o menos equivalentes, y se encargarán de descargar los paquetes necesarios y de dejarlos funcionando. De nuevo suponiendo que los tengas en tu PATH, lo cual no sé si se cumple en Windows...
  #7 (permalink)  
Antiguo 14/02/2011, 11:12
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

perfecto razpeitia, ya tengo el BeautifulSoup instalado!!!!
estoy ejecutando el codigo de mi amigo y no me funciona:

tengo el html de la pagina guardado en la variable html, entonces:

bs = BeuatifulSoup(html)
bs. img

pero mi scrip se cierra tan pronto termina su ejecución, no puedo vizualisar la lista de imagenes, alguna idea

tambien pruebo de hacer un print bs pero no da resultado...
  #8 (permalink)  
Antiguo 14/02/2011, 13:49
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Crawler

Correrlo desde tu consola favorita. O añade raw_input() al final de tu script.
  #9 (permalink)  
Antiguo 15/02/2011, 02:59
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

sisi ya tengo un raw_input() al final del script... esto no me hace nada :S continua cerrandose el script.
Alguien sabe como puede debugar para encontrar el error de mi script, o alguien sabe algun software para programar en python i poder encontar los errores ??? por ejemplo en java seria el eclipse, y en python ?????
  #10 (permalink)  
Antiguo 15/02/2011, 09:11
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Crawler

Como te dije ejecútalo desde la consola, de esa manera aunque termine tu script podrás ver lo que arrojo. Si estas en windows puedes usar el IDE que trae por defecto y si estas en linux usas la consola y listo.

También puedes usar algún otro IDE como eclipse, netbeans, etc.

Bueno te dejo un script de prueba:
Código Python:
Ver original
  1. import BeautifulSoup
  2. import urllib
  3.  
  4. f = urllib.urlopen("http://www.forosdelweb.com/")
  5. data = f.read()
  6. f.close()
  7. p = BeautifulSoup.BeautifulSoup(data)
  8. for img in p.findAll("img"):
  9.     print img
  #11 (permalink)  
Antiguo 16/02/2011, 09:53
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

Si señor!!!!! Razpeitia!!!
tengo el codigo compilado perfecto y sin erroes, ya me puede mostrar todas las imagenes que existen en una pagina web, pero quiero llegar mas lejos, me gusta lo imposible xD.
Me gustaria poder descargar dichas imagenes en mi pc, es decir hacer el mismo for que me dices, pero ademas de decir la dirección de las imagenes en pantalla, que me las descarge en un directorio de mi compu!!!

Se que existe la libreria mechanize, la qual te permite hacer una conexion http y ftp con un servidor, pero no tengo mucha idea de su funcionamiento,
que opinas amigo ??? utilizarias otra tu ???

graciassss de antemano!!!!!
  #12 (permalink)  
Antiguo 16/02/2011, 10:03
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Crawler

Tengo varias soluciones para eso.
1.- Usar urllib como en este post
2.- Si estas en linux a la salida de tu script pásalo por una tubería a un wget
3.- Usar algún otro modulo de python para descargar.
  #13 (permalink)  
Antiguo 16/02/2011, 10:56
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

Me gusta el tema de la urllib!!!
ya he visitado este post que me comentas, pero estoy un poco perdido...
estoy trabajando con windows, me echas una mano de codigo????

graciassssss
  #14 (permalink)  
Antiguo 16/02/2011, 12:14
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Crawler

Mejor postea lo que llevas hecho, lo que esperas recibir y lo que estas recibiendo.
  #15 (permalink)  
Antiguo 17/02/2011, 04:16
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

Este es mi codigo echo asta el momento
********************************************
Código Python:
Ver original
  1. import urllib
  2. from BeautifulSoup import BeautifulSoup
  3.  
  4. inicio = raw_input('introducir la pagina web con formato http://www.exemple.com : ')
  5.  
  6. #pasar la pagina a codigo html
  7.  
  8. sock = urllib.urlopen(inicio)
  9. htmlSource = sock.read()                            
  10. sock.close()
  11.  
  12. #print htmlSource
  13.  
  14. #imprimir direccion de las imagenes
  15.  
  16. bs = BeautifulSoup(htmlSource)
  17. for img in bs.findAll("img"):
  18.     print img
  19.    
  20. print ('enter pera finalizar')
  21. raw_input()
*********************************************

El cual me da la direccion de la imagen en la pagina que meto por el input, ahora mi objetivo es poder descargar dichas imagenes en un directorio en mi compu!!!

Dejo que manipules el codigo y que me postees las modificaciones.

graciassssss

Última edición por AlvaroG; 17/02/2011 a las 05:29 Razón: por favor usa coloreado de código con la etiqueta HIGHLIGHT
  #16 (permalink)  
Antiguo 17/02/2011, 05:32
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crawler

Pues es simple, de hecho no necesitás más que repetir líneas de código que ya tenés:

Para cada imagen:
1.- obtenés el nombre (os.path.basename)
2.- usás open() para crear un archivo con ese nombre en el directorio actual
3.- usás urllib/read para recuperar la imagen del servidor y almacenarla en una variable
4.- usás el método write() del archivo que creaste para escribir en él la variable que contiene la imagen.
5.- cerrás tanto el archivo como la conexión al servidor.
  #17 (permalink)  
Antiguo 17/02/2011, 05:53
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

ufffff AlvaroG
he estado trabajando un rato sobre tu idea y no me aclaro, vamos te explico, consigo guardar la direccion de la imagen en una lista, es decir si la pagina tiene 4 imagenes las meto en una lista, lo que tengo dentro de la lista es esto que me comentas de "os.path.basename" o voy mal?

dentro de la lista tengo: [<img scr="/img/cert.jpg" alt="" height = "55" width = "55"/>] esto es una imagen de dicha pagina.
Ahora tengo que desccargar esta imagen en mi compu, pero no se continuar con el paso 2....

me ayudas con un ejemplo de codigo pleaseeee

graciassss

Última edición por Ricrever; 17/02/2011 a las 06:55
  #18 (permalink)  
Antiguo 17/02/2011, 07:41
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crawler

no tengo un intérprete de Python acá, así que lo siguiente puede tener errores.

bs.img es un atajo para bs.findall("img").
La representación de la etiqueta sea la etiqueta misma, pero el objeto también posee algunos atributos, en especial el valor de los atributos en el HTML. Por lo tanto, podés obtener la ruta de la imagen como

Código Python:
Ver original
  1. for imagen in bs.img:
  2.     ruta = imagen.src
  3.     nombre_archivo = os.path.basename(ruta)

Lo que te comentaba es que crees el archivo local con el nombre que obtengas de nombre_archivo. si estás en windows, asegurate de usar un modo de apertura binario para el archivo, o de lo contrario no quedará bien guardado (usa, por ejemplo el modo 'wb' para crear el archivo nuevo)


Saludos.
  #19 (permalink)  
Antiguo 21/02/2011, 09:53
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

Hola AlvaroG, perdon por el retraso, pero el fin de semana estava de viaje.
Estoy trabajando con esto, pero no entiendo como crear el archivo donde me va a guardar las imagenes en mi compu.
¿Como creao el archivo local con el nombre que obtengo de nombre_archivo. ????? y estoy trabajando en windows, como hago para usar un modo de apertura binario para el archivo???

Por lo que veo en el codigo anterior, la linia 3 de codigo, mete en la variable nombre_archivo la direccion path de la foto, pero ahora como interpreto dicha variable? que tengo que hacer con ella?

ayudaaaa porfavor!!!!!
  #20 (permalink)  
Antiguo 21/02/2011, 14:22
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Crawler

Código Python:
Ver original
  1. import urllib
  2. import os
  3. from BeautifulSoup import BeautifulSoup
  4.  
  5. url = raw_input('URL -> ')
  6.  
  7. f = urllib.urlopen(url)
  8. data = f.read()
  9. f.close()
  10.  
  11. soup = BeautifulSoup(data)
  12. for counter, img in enumerate(soup.findAll('img')):
  13.     if img['src'].startswith("http://"):
  14.         ipath = img['src']
  15.     else:
  16.         ipath = url + img['src']
  17.  
  18.     try:
  19.         local = open(img['src'].split("/")[-1]), "wb")
  20.         internet = urllib.urlopen(ipath)
  21.     except IOError:
  22.         continue
  23.  
  24.     data = internet.read()
  25.     local.write(data)
  26.  
  27.     internet.close()
  28.     local.close()
Mas o menos quedaría así.
  #21 (permalink)  
Antiguo 22/02/2011, 03:58
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

que grande razpeitia!!!!!!
muchas gracias por tu codigo ;))) he detectado un pequeño error, pero nada importante, en la linia 19 hace falta un parentesi despues de open para cerrar el ultimo: local = open((img['src'].split("/")[-1]), "wb")

voi a continuar trabajando con el tema ya que quiero llegar mas lejos, voy inentar hacerlo recursivo, es decir, que dentro de una url, busque todas sus url's secundarias y que pueda descargar tambien las imagenes, en cuando me aparezcan dudas te las comento!!! y estoy segurisimo que me las podras solucionar.

AlvaroG, tambien te agrazesco tu colaboracion por la aportacion!!! voy a continuar trabajando!!!! y a tener mas consultas :)


gracias por tu colaboración!!! ;))))

Última edición por Ricrever; 22/02/2011 a las 04:09
  #22 (permalink)  
Antiguo 23/02/2011, 09:33
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

Bien amigos,he seguido trabjando con mi crawler, y ahora tengo un pequeño problema, resulta que tengo una lista de url separadas por una coma, es decir:
['http://www.pagina1.com/','http://www.pagina2.com/'] lo que quiero es recorrer esta lista y coger cada url y descargarme las imagenes, como el paso anterior.
Tengo el siguiente codigo, pero no me rula y no puedo entender porque!!!!

Código Python:
Ver original
  1. nom_archiu = raw_input('introducir el archivo .txt: ')
  2. f = open (nom_archiu)
  3. datos = f.read()
  4.  
  5. lista = string.split(datos)
  6. print lista
  7.  
  8. for i in range(len(lista)):
  9.     sock = urllib.urlopen(lista[i])
  10.     data = sock.read()
  11.     sock.close()
  12.     soup = BeautifulSoup(data)
  13.     for counter, img in enumerate(soup.findAll('img')):
  14.         if img['src'].startswith("http://"):
  15.             ipath = img['src']
  16.         else:
  17.             ipath = url + img['src']
  18.    
  19.         try:
  20.             local = open((img['src'].split("/")[-1]), "wb")
  21.             internet = urllib.urlopen(ipath)
  22.         except IOError:
  23.             continue
  24.        
  25.         data = internet.read()
  26.         local.write(data)
  27.  
  28.         internet.close()
  29.         local.close()

creo que el error esta en el if, he debugado el codigo y cuando llega al if me peta el program, pero no entiendo porque....
igual es que al coger el elemento de la lista me lo coge como un string i no como una url, nolose... o igual es culpa del segundo for que no lo cierro bien.... llevo varias horas dandole al tema...
me gustaria mucho vustra ayuda amigos!!!!

gracias de antemano!!!

Última edición por Ricrever; 23/02/2011 a las 09:54
  #23 (permalink)  
Antiguo 28/02/2011, 11:47
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crawler

¿Da alguna excepción? ¿no hace nada? ¿Qué quiere decir "no me anda"?
  #24 (permalink)  
Antiguo 01/03/2011, 03:01
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

bien, resulta que tengo una lista de urls => ["http://www.pagina1.com","http://www.pagina2.com"]

lo que quiero es recorrer dicha lista y descargar las imagenes de cada url, de una url se como se hace, pero cuando tengo la lista nose pk no me deja... el codigo que tengo echo es el del anterior post, he debugado el codigo y cuando llega al if, se me cierra el script y nose pork....

si me puedes ayudar..

y si quieres mas info pide!!
  #25 (permalink)  
Antiguo 01/03/2011, 08:48
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Crawler

El for tiene un detalle que no pude encontrar, incluso tomé el código y lo modifiqué un poco para que sea más "pythónico" pero tuve problemas para hacer funcionar el for. Debo admitir que tampoco es que lo haya investigado demasiado

Hay otro problema menor y es que la variable url de la línea 17 no existe. No importa, con los cambios que te propongo ya no será un problema:
1.
Código Python:
Ver original
  1. for i in range(len(lista)):
  2.     sock = urllib.urlopen(lista[i])
cambia por
Código Python:
Ver original
  1. for url in lista:
  2.     sock = urllib.urlopen(url)

2.
Código Python:
Ver original
  1. for counter, img in enumerate(soup.findAll('img')):
cambia por
Código Python:
Ver original
  1. for img in soup('img'):

3.
Código Python:
Ver original
  1. local = open((img['src'].split("/")[-1]), "wb")
cambia por
Código Python:
Ver original
  1. local = open(os.path.basename(img['src']), "wb")
(tendrás que importar el módulo os para que este último funcione)


Saludos.
  #26 (permalink)  
Antiguo 02/03/2011, 09:27
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

Perfectisimo AlvaroG!!!
Me as dado una magnifica ayuda!!!
Me funciona, y aunque si la lista contiene muchas urls, me tarda un poco la verdad es que me descarga todas las imagenes en mi directorio.
Por ciero, como vas del tema python+mysql???

Te comento, ueno comento a toda la comunidad, tengo el archivo .txt y quiero hacer un script de tal modo que me carge este archivo a una tabla mysql, y esto que me lo haca periodico, por ejemplo, cada dos dias que me carge el archivo .txt en dicha tabla!!!

Alguna sugerencia??
Jo voi haver si pico algo de codigo y os lo comento!!!

thanksssss
  #27 (permalink)  
Antiguo 02/03/2011, 12:42
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Crawler

El archivo txt esta separado cada por comas o algun otro delimitador?
En cualquier caso, te recomiendo usar el modulo csv + MySQLdb + cron job

Si estas en un ambiente windows, cambia el cron job por una tarea programada.
  #28 (permalink)  
Antiguo 03/03/2011, 03:26
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

El archivo txt esta separado per returns, en cada linia tengo una url.
Bien me descarge el modulo MySQL-python-1.2.3, le doy al setup.py que me biene en el paquete i no me hace nada.
He puesdo la carpeta dentro de python26\Lib\site-packages. me voi al cmd y ejecudo desde alli el setup.py me da el siguiente error:

C:\Python26\Lib\site-package\MySQL-python-1.2.3>setup.py
Traceback (most recent call last):
<module>
metada,options = get_config()
File "C:\Python26\Lib\site-package\MySQL-python-1.2.3>setup_windows",line 7, in get_config
serverKey = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, options['registry_key']
WindowsError: [Error 2] El sistema no puede hallar el archivo especificado.


No entiendo que estoy haciendo mal, tengo el xamp instalado con una version de MySQL 5.5.8 y estan funcionando cuando intento instalar el modulo. Me puedes ayudar porfavor.

estoy trabajando en entorno Windows XP

ayuda porfavor!!
  #29 (permalink)  
Antiguo 03/03/2011, 13:36
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Crawler

Es un error que tiene con las versiones 2.6 >=
La recomendación es usar un binario para instalarlo.

Aquí te dejo una lista de varios módulos hechos binarios para windows.

Recuerda bajar la versión adecuada a tu instalación de python y a tu versión de windows (32 o 64 bits)
  #30 (permalink)  
Antiguo 04/03/2011, 04:28
 
Fecha de Ingreso: febrero-2011
Ubicación: Tarragona, España
Mensajes: 51
Antigüedad: 13 años, 9 meses
Puntos: 0
Respuesta: Crawler

Gracias razpeitia!!! ya lo he hecho funcionar!!!
Te comento una consulta, tengo un archivo .csv el cual quiero insertar en una base de datos.
Sabes como puedo hacerlo ahora que ya tengo la libreria MySQLdb.
Te comento, tengo la base de datos prueba1, con una tabla k_url i que tiene dos columnas.
lo que quiero es insertar un archivo .cvs dentro de la tabla.
Tengo el siguiente codigo, pero no me lo inserta....

Código Python:
Ver original
  1. import csv
  2. import MySQLdb
  3.  
  4. conn = MySQLdb.connect(host = "localhost",user = "root", passwd="",db="prueba1")
  5. ejecutar = conn.cursor().execute
  6.  
  7. def insertar(identificacio,url):
  8.     ejecutar("INSERT TO k_urls("+identificacio+","+url+")")
  9.  
  10.  
  11. reader = csv.DictReader(open('prova1.csv'))
  12.  
  13. for (linia in reader):
  14.     map(insertar,linia.split(","))
  15.  
  16. cursor.close()

nose de quien tiene la culpa de esto, si la connexion con la db, o si el reader para abrir el archivo .csv!!!!

Alguna idea por aqui???

Mil gracias a todos!!!

Última edición por Ricrever; 04/03/2011 a las 05:12

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 14:16.