scraping node javascript node.js web-scraping phantomjs

node - javascript web automation



PhantomJS abierto() demasiado lento (1)

Tengo un problema con el desecho web en NodeJS, quiero tomar algunos datos de la página web remota, pero los datos se insertan en html desde el javascript. Empecé a usar PhantomJS y funciona muy bien, excepto una cosa que me impide terminar mi trabajo. PhantomJS funciona demasiado lento, este fragmento de código necesita aproximadamente 14 segundos para ejecutarse?

var page = require(''webpage'').create(); page.open(''https://www.halooglasi.com/nekretnine/izdavanje-stanova/novi-beograd---novi-merkator-id19270/5425485514649'', function () { phantom.exit(); });

con la biblioteca de solicitudes que solo devuelve datos sin procesar es mucho más rápido, un poco más de un segundo, por lo que el fantasma JS está trabajando otros 13 segundos más o menos. Parece que PhantomJS está haciendo muchas operaciones innecesarias que no necesito, no necesito renderizar imágenes ni videos, solo necesito ejecutar javascript para poder usar cheerio para obtener los datos de html. ¿Puede decirme cómo acelerar PhantomJS o tal vez usar algún otro kit web más rápido para mis necesidades?


Hay varias medidas que puede tomar para disminuir el tiempo de procesamiento.

1. Obtenga un servidor / computadora más potente (como Mathieu señaló correctamente) .

Sí, podría argumentar que esto es irrelevante para la pregunta, pero en materia de raspado es mucho lo que es. Con un presupuesto de $ 8 VPS sin optimización, su secuencia de comandos inicial se ejecutó en 9589ms que ya representa una mejora de ~ 30%.

2. Desactiva la carga de imágenes. Ayudará ... un poco. 8160ms tiempo de carga.

page.settings.loadImages = false;

3. Analiza la página, encuentra y cancela solicitudes de red innecesarias.

Incluso en un navegador normal como Google Chrome, el sitio carga lentamente: 129 solicitudes / 8.79s de tiempo de carga con AdblockPlus. Hay muchas solicitudes (gif, 1Mb), muchas si son para sitios de terceros como Facebook, Twitter (para buscar widgets) y para sitios publicitarios.

Podemos cancelarlos también:

block_urls = [''gstatic.com'', ''adocean.pl'', ''gemius.pl'', ''twitter.com'', ''facebook.net'', ''facebook.com'', ''planplus.rs'']; page.onResourceRequested = function(requestData, request){ for(url in block_urls) { if(requestData.url.indexOf(block_urls[url]) !== -1) { request.abort(); console.log(requestData.url + " aborted"); return; } } }

El tiempo de carga para mí ahora es de tan solo 4393ms mientras la página está cargada y es utilizable: captura de pantalla de PhantomJS

No creo que se pueda hacer mucho más sin modificar el código de la página porque, a juzgar por la fuente de la página, es un script bastante pesado.

Todo el código

var page = require(''webpage'').create(); var fs = require("fs"); // console.time polyfill from https://github.com/callmehiphop/console-time ;(function( console ) { var timers; if ( !console ) { return; } timers = {}; console.time = function( name ) { if ( name ) { timers[ name ] = Date.now(); } }; console.timeEnd = function( name ) { if ( timers[ name ] ) { console.log( name + '': '' + (Date.now() - timers[ name ]) + ''ms'' ); delete timers[ name ]; } }; }( window.console )); console.time("open"); page.settings.loadImages = false; page.settings.userAgent = ''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36''; page.viewportSize = { width: 1280, height: 800 }; block_urls = [''gstatic.com'', ''adocean.pl'', ''gemius.pl'', ''twitter.com'', ''facebook.net'', ''facebook.com'', ''planplus.rs'']; page.onResourceRequested = function(requestData, request){ for(url in block_urls) { if(requestData.url.indexOf(block_urls[url]) !== -1) { request.abort(); console.log(requestData.url + " aborted"); return; } } } page.open(''https://www.halooglasi.com/nekretnine/izdavanje-stanova/novi-beograd---novi-merkator-id19270/5425485514649'', function () { fs.write("longload.html", page.content, ''w''); console.timeEnd("open"); setTimeout(function(){ page.render(''longload.png''); phantom.exit(); }, 3000); });