phantomjs - casperjs test
Toma el contenido de los recursos en CasperJS o PhantomJS (4)
Descubrí que hasta que el phantomjs madure un poco, de acuerdo con el problema 158 http://code.google.com/p/phantomjs/issues/detail?id=158 esto es un poco de dolor de cabeza para ellos.
¿Así que quieres hacerlo de todos modos? He optado por ir un poco más alto para lograr esto y he tomado PyMiProxy en https://github.com/allfro/pymiproxy , descargado, instalado, configurado, tomó su código de ejemplo y lo hice en proxy.py
from miproxy.proxy import RequestInterceptorPlugin, ResponseInterceptorPlugin, AsyncMitmProxy
from mimetools import Message
from StringIO import StringIO
class DebugInterceptor(RequestInterceptorPlugin, ResponseInterceptorPlugin):
def do_request(self, data):
data = data.replace(''Accept-Encoding: gzip/r/n'', ''Accept-Encoding:/r/n'', 1);
return data
def do_response(self, data):
#print ''<< %s'' % repr(data[:100])
request_line, headers_alone = data.split(''/r/n'', 1)
headers = Message(StringIO(headers_alone))
print "Content type: %s" %(headers[''content-type''])
if headers[''content-type''] == ''text/x-comma-separated-values'':
f = open(''data.csv'', ''w'')
f.write(data)
print ''''
return data
if __name__ == ''__main__'':
proxy = AsyncMitmProxy()
proxy.register_interceptor(DebugInterceptor)
try:
proxy.serve_forever()
except KeyboardInterrupt:
proxy.server_close()
Entonces lo enciendo
python proxy.py
A continuación ejecuto phantomjs con el proxy especificado ...
phantomjs --ignore-ssl-errors=yes --cookies-file=cookies.txt --proxy=127.0.0.1:8080 --web-security=no myfile.js
Puede que desee activar su seguridad o algo así, no era necesario para mí actualmente, ya que estoy raspando solo una fuente. Ahora debería ver un montón de texto que fluye a través de su consola de proxy y si cae en algo con el tipo mime de "texto / x-coma-separados-valores" lo guardará como data.csv. Esto también salvará todos los encabezados y todo, pero si has llegado hasta aquí, estoy seguro de que puedes descubrir cómo quitarlos.
Otro detalle, encontré que tuve que deshabilitar la codificación gzip, podría usar zlib y descomprimir los datos en gzip desde mi propio servidor web Apache, pero si sale de IIS o la descompresión obtendría errores y No estoy seguro de esa parte de eso.
¿Entonces mi compañía de energía no me ofrecerá una API? ¡Multa! ¡Lo hacemos de la manera más dura!
Veo que CasperJS tiene una función de "descarga" y una devolución de llamada "en el recurso recibido" pero no veo el contenido de un recurso en la devolución de llamada y no quiero descargar el recurso al sistema de archivos.
Quiero capturar el contenido del recurso para poder hacer algo con él en mi script. ¿Es esto posible con CasperJS o PhantomJS?
Este problema ha estado en mi camino durante los últimos días. La solución proxy no estaba muy limpia en mi entorno, así que descubrí dónde ponía los recursos el núcleo de QTNetworking de phantomjs cuando los almacenaba en caché.
Larga historia corta, aquí está mi esencia. Necesita los archivos cache.js y mimetype.js: https://gist.github.com/bshamric/4717583
//for this to work, you have to call phantomjs with the cache enabled:
//usage: phantomjs --disk-cache=true test.js
var page = require(''webpage'').create();
var fs = require(''fs'');
var cache = require(''./cache'');
var mimetype = require(''./mimetype'');
//this is the path that QTNetwork classes uses for caching files for it''s http client
//the path should be the one that has 16 folders labeled 0,1,2,3,...,F
cache.cachePath = ''/Users/brandon/Library/Caches/Ofi Labs/PhantomJS/data7/'';
var url = ''http://google.com'';
page.viewportSize = { width: 1300, height: 768 };
//when the resource is received, go ahead and include a reference to it in the cache object
page.onResourceReceived = function(response) {
//I only cache images, but you can change this
if(response.contentType.indexOf(''image'') >= 0)
{
cache.includeResource(response);
}
};
//when the page is done loading, go through each cachedResource and do something with it,
//I''m just saving them to a file
page.onLoadFinished = function(status) {
for(index in cache.cachedResources) {
var file = cache.cachedResources[index].cacheFileNoPath;
var ext = mimetype.ext[cache.cachedResources[index].mimetype];
var finalFile = file.replace("."+cache.cacheExtension,"."+ext);
fs.write(''saved/''+finalFile,cache.cachedResources[index].getContents(),''b'');
}
};
page.open(url, function () {
page.render(''saved/google.pdf'');
phantom.exit();
});
Luego, cuando llame a phantomjs, solo asegúrese de que el caché esté habilitado:
phantomjs --disk-cache = true test.js
Algunas notas: escribí esto con el propósito de obtener las imágenes en una página sin usar el proxy o tomar una instantánea de baja resolución. QT usa la compresión en ciertos recursos de archivos de texto y tendrá que lidiar con la descompresión si usa esto para archivos de texto. Además, ejecuté una prueba rápida para extraer recursos html y no se analizaron los encabezados http del resultado. Pero, esto me es útil, espero que alguien más lo encuentre así, modifíquelo si tiene problemas con un tipo de contenido específico.
No me di cuenta de que podía agarrar la fuente del objeto de documento de esta manera:
casper.start(url, function() {
var js = this.evaluate(function() {
return document;
});
this.echo(js.all[0].outerHTML);
});
Más información here .
Puede usar Casper.debugHTML()
para imprimir el contenido de un recurso HTML:
var casper = require(''casper'').create();
casper.start(''http://google.com/'', function() {
this.debugHTML();
});
casper.run();
También puede almacenar el contenido HTML en una var usando casper.getPageContent()
: http://casperjs.org/api.html#casper.getPageContent (disponible en el último maestro)