Pregunta

Tengo una sección de una página web que necesito para tomar una instantánea GIF en un intervalo de tiempo determinado. La instantánea debe ser una resolución de tamaño de página completa, sin embargo, como dije, solo va a cierto lugar en la página (en este caso es después de una tabla).

¿Cuál sería la mejor manera de obtener una imagen de la imagen de instantánea de página como esta? Me gustaría tirarlo a un trabajo de Cron y olvidarlo, pero no estoy viendo fácilmente una herramienta que haga un trabajo rápido de esto.

SOLUCIÓN:

Según la excelente dirección de @Eduardo, implementé una solución limpia y rápida basada en PhantomJS e ImageMagick (Mac: brew install phantomjs & brew install imagemagick):

*Nota: si desea eliminar ImageMagick por completo, simplemente agregue lo siguiente a Rasterize.js: page.clipRect = { top: 10, left: 10, width: 500, height: 500 }

#! /usr/bin/env bash
# Used with PhantomJS - rasterize.js source: http://j.mp/xC7u1Z

refresh_seconds=30

while true; do
    date_now=`date +"%Y-%m-%d %H%M"` 

    phantomjs rasterize.js $1 "${date_now}-original.png"  # just sucking in the first arg from shell for the URL
    convert "${date_now}-original.png" -crop 500x610+8+16 "${date_now}.png" # crop args: WIDTHxHEIGHT+LEFT_MARGIN+TOP_MARGIN
    rm "${date_now}-original.png"

    echo "Got image: ${date_now}.png - Now waiting ${refresh_seconds} seconds for next image..."
    sleep ${refresh_seconds}
done

Y aquí está el JS utilizado por Phantomjs en lo anterior:

// As explained here: http://code.google.com/p/phantomjs/wiki/QuickStart

var page = new WebPage(),
    address, output, size;

if (phantom.args.length < 2 || phantom.args.length > 3) {
    console.log('Usage: rasterize.js URL filename');
    phantom.exit();
} else {
    address = phantom.args[0];
    output = phantom.args[1];
    page.viewportSize = { width: 600, height: 600 };
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
        } else {
            window.setTimeout(function () {
                page.render(output);
                phantom.exit();
            }, 200);
        }
    });
}
¿Fue útil?

Solución

Esta pregunta ya ha sido respondida aquí:¿Cómo puedo tomar una captura de pantalla/imagen de un sitio web usando Python?

Fue respondido el '09, pero esa opción sigue siendo muy válida. Intentaré extender con algunas opciones más.

Esas herramientas le brindarán instantáneas de página completa, que más tarde puede recortar usando ImageMagick fácilmente.

Otra opción que podría tener en estos días es Fantomjs. Phantom es un navegador sin cabeza construido para ejecutarse en el nodo, le permitirá tomar una foto de una página completa o simplemente un área de la página.

Echa un vistazo a este ejemplo:

var page = new WebPage(),
    address, output, size;

if (phantom.args.length < 2 || phantom.args.length > 3) {
    console.log('Usage: rasterize.js URL filename');
    phantom.exit();
} else {
    address = phantom.args[0];
    output = phantom.args[1];
    page.viewportSize = { width: 600, height: 600 };
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('Unable to load the address!');
        } else {
            window.setTimeout(function () {
                page.render(output);
                phantom.exit();
            }, 200);
        }
    });
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top