2009-05-03 43 views
9

estoy tratando de guardar una imagen de un sitio web utilizando el servidor de selenio & cliente de python. conozco la URL de la imagen, pero no puedo encontrar el código para guardarla, ya sea cuando se trata del documento en sí o cuando está incrustado en la sesión actual del navegador.guardar una imagen con selenio y firefox

la solución que encontré hasta ahora es guardar la captura de pantalla de la página (hay 2 métodos de selenio para hacer exactamente eso), pero quiero la imagen original.

no me importa juguetear con las opciones del menú haciendo clic, etc. pero no pude encontrar cómo.

gracias

+0

Ha pasado tiempo, pero me pregunto, ¿ha encontrado una solución? – johnjohn

+0

no, no tengo .. –

+0

Tengo una solución para esto. Extendí el userscript.js de Selenio. Amplió los derechos de Firefox para capturar capturas de pantalla en userpref.js y usó algo similar a Scott Szretter para capturar la pantalla y enviar los datos de la imagen al servidor. – powtac

Respuesta

-1

¿Qué hay de ir a la URL de la imagen y luego tomar una captura de pantalla de la página? Firefox muestra la imagen en pantalla completa. Espero que esta ayuda ..

+0

como ya escribí, esta es mi solución actual. –

0

No he utilizado el selenio, pero si conoce la dirección URL de la imagen, ¿por qué no hacer:

from urllib import urlretrieve 

urlretrieve(url, filename) 

que salvará la url al nombre de archivo. más información here

+4

porque guardar la imagen depende de la sesión. la razón del selenio en primer lugar es la prueba en un entorno real. el servidor recibe la url de hecho, pero analiza muchas variables de entorno relacionadas con la sesión antes de decidir qué imagen entregar, en caso de haberla. –

+0

entonces, tal vez usted puede obtener las cookies de selenio y usar urllib2 para también pasarlas en la solicitud? –

+3

sesión es más que solo cookies, y para imitarlo en urrlib2, significa imitar a Selenium RC, entonces ¿por qué iba a usar selenio en primer lugar? –

3

Para hacer esto de la manera deseada (para realmente capturar el contenido enviado al navegador) que había necesidad de modificar el código de representación de selenio RC (ver ProxyHandler.java) y almacenar los archivos localmente en el disco en paralelo a enviar la respuesta de vuelta al navegador.

+0

Eso es ... interesante. Pero luego guardará TODOS los archivos, y tendré que adivinar qué archivo pertenece a cada punto en el tiempo, sin mencionar aprender un poco de Java. Pero es una solución posible. –

2

Intentaba realizar la misma tarea, pero las imágenes que quería tomar eran del tamaño de mi monitor (fondo de pantalla), por lo que la solución de captura de pantalla de captura no me funcionó. Descubrí una forma de hacerlo ...

Tengo el selenio configurado para ir a la página que quiero (que induce todas las golosinas de la sesión) Luego usé un programa llamado "Macro de área de trabajo" para recorrer a través de las tareas de selenio.

Agarrar desde aquí http://www.tethyssolutions.com/product.htm - tienen una versión de prueba, que creo que funciona para 30 carreras o algo así.

Así que aquí es la progresión:

  • inicio Firefox
  • selenio abierta y prueba de carga caso
  • iniciarlo, pero rápidamente hacer una pausa.
  • grabar una macro, que empuja "paso" en selenio, a continuación, se acerca a la ventana de Firefox y hace clic en Archivo-> Guardar como página, ahorra, a continuación, detener la grabación
  • corren los tiempos x macro ...
  • ¿¿lucro??

Saludos

5

I encontraron código que pone una imagen a una lona, ​​entonces la convierte a datos - que podría entonces ser base64 codificadas por ejemplo. Mi idea era llamar esto usando el comando eval en selenio; sin embargo, en mis pruebas, toDataURL arroja un error de seguridad 1000. Parece que está muy cerca de una solución si no es por ese error.

var data, canvas, ctx; 
var img = new Image(); 
img = document.getElementById("yourimageID"); 
canvas = document.createElement('canvas'); 
canvas.width = img.width; 
canvas.height = img.height; 
ctx = canvas.getContext("2d"); 
ctx.drawImage(img, 0, 0); // everything works up to here 
data = canvas.toDataURL(); // this fails *** 
var base64Img = data.replace(/^data:image\/(png|jpg);base64,/, ""); 

Haciendo un poco de investigación he encontrado referencias que no está permitido el uso de toDataURL cuando la imagen es de un dominio diferente. Sin embargo, incluso intenté este código guardando la página, eliminando todo excepto la imagen misma y este script.

Por ejemplo (index.html):

<html><head></head><body> 
<img src="local/hard/disk/img.jpg" id="yourimageID"> 
<script> 
// script from above 
</script> 
</body></html> 

El img.jpg y index.html se almacenan localmente, abrir la página en Firefox localmente, aún así obtener un error de seguridad 1000!

+0

idea totalmente genial! ¿Encontraste una forma de eludir el bloqueo de seguridad? – johnjohn

Cuestiones relacionadas