2012-04-27 17 views
5

Tengo un script (debajo) que raspa un sitio con un proceso de 3 pasos. funciona muy bien cuando se establece en un máximo de 1 página a la vez. sin embargo, cuando aumento eso a 2 por vez las cosas empiezan a ponerse flojas. los fuegos encendidos antes de lo esperado y la página aún no está completamente cargada. debido a esto, el resto de mi guión se rompe. ¿Alguna idea de por qué esto podría estar sucediendo? debería agregar que estoy usando la versión más nueva (1.5).Comportamiento de carga inesperado de PhantomJS con varias páginas

MAX_PAGES = 1 
### 
changing MAX_PAGES to >1 causes some pages onFinished event to fire before 
the page is fully rendered. this is evident by the fact that there are >1 images 
for some pages. i havent been able to reproduce using microsoft.com, but on some 
pages i was working on the first onLoadFinished seemed to be called before the page 
was actually fully loaded based on the look of the rendered images 
### 

newPage = (id) -> 
context = {} 
context.id = id 
context.step = 0 
context.page = require('webpage').create() 
context.page.onLoadStarted = -> 
    context.step++ 
context.page.onLoadFinished = (status) -> 
    console.log status 
    if status is 'success' 
     context.page.render("#{context.id}_#{context.step}.png") 
    else 
     context.page.release() 
     context.page.open('http://www.microsoft.com') 
     console.log 'started loading' 

newPage id for id in [1..MAX_PAGES] 

Respuesta

4

creo que el problema tiene que ver con el hecho de que cada página web dentro de PhantomJS está utilizando el mismo QNetworkAccessManager, por lo tanto, la señal finished() está disparando cuando cada objeto de la página termina de cargar. Es posible que sea necesario realizar modificaciones en el código de PhantomJS para solucionar este problema. Me he dado cuenta de esto antes al intentar cargar varias páginas en paralelo en PhantomJS. Una aplicación en la que estoy trabajando usa QtWebkit y carga varias páginas simultáneamente, así que debo asegurarme de que cada página web tenga su propio QNetworkAccessManager para que las señales terminadas() no interfieran entre sí.

3

Para rastrear varias páginas, consulte el ejemplo follow.js que se incluye con la biblioteca. https://github.com/ariya/phantomjs/blob/master/examples/follow.js

Debe utilizar la recursividad para esperar a que se cargue la página actual antes de cargar la página siguiente.

+0

Si no es una llamada recursiva como en este ejemplo, al menos una devolución de llamada que desencadenará el siguiente rastreo. –

+0

Tu enlace está roto :( – Julien

Cuestiones relacionadas