Domanda

Ho una sezione di una pagina Web di cui devo prendere un'istantanea GIF ad un determinato intervallo di tempo. L'istantanea deve essere la risoluzione delle dimensioni della pagina completa, tuttavia come ho detto, va solo in un determinato posto sulla pagina (in questo caso è dopo una tabella).

Quale sarebbe il modo migliore per prendere un'immagine di istantanea di una pagina come questa? Mi piacerebbe semplicemente gettarlo in un lavoro Cron e dimenticarlo, ma non vedo prontamente uno strumento che farebbe un lavoro veloce su questo.

SOLUZIONE:

Secondo l'eccellente direzione di @Eduardo, ho implementato una soluzione pulita e rapida basata su Phantomjs e ImageMagick (Mac: brew install phantomjs & brew install imagemagick):

*Nota: se si desidera rimuovere del tutto ImageMagick, aggiungi quanto segue 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

Ed ecco i JS usati da Phantomjs in quanto sopra:

// 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);
        }
    });
}
È stato utile?

Soluzione

Questa domanda è già stata data risposta qui:Come posso fare uno screenshot/immagine di un sito Web usando Python?

È stato risposto sul '09, ma quell'opzione è ancora molto valida. Cercherò di estendersi con altre opzioni.

Questi strumenti ti porteranno le istantanee della pagina intera, che puoi successivamente clip usando ImageMagick facilmente.

Un'altra opzione che potresti avere in questi giorni è Phantomjs. Phantom è un browser senza testa costruito per essere eseguito sul nodo, ti permetterà di scattare una foto di un'intera pagina o solo un'area della pagina.

Date un'occhiata al questo esempio:

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);
        }
    });
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top