2012-04-27 2 views
5

3段階のプロセスでサイトをスクラップするスクリプト(以下)があります。一度に最大1ページに設定すると効果的です。しかし、私は2時にそれを増加させると、物事は夢中になる。 onFinished火災は私が予想していたよりも早く、ページはまだ完全にロードされていません。私のスクリプトの残りの部分はこれにより休止します。なぜこのことが起こっているのでしょうか?私は最新のバージョン(1.5)を使用していることを追加する必要があります。複数のページでPhantomJS予期しない読み込み動作が発生する

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] 

答えて

4

は、私はこの問題はPhantomJS内の各Webページは、このように、同じQNetworkAccessManagerを使用している各ウェブページオブジェクトの読み込みが完了すると、finished()信号が発射されているという事実に関係していると思います。この問題を解決するには、PhantomJSのコードを変更する必要があります。 PhantomJSで複数のページを並行して読み込もうとすると、これまで気づいたことがあります。私が取り組んでいるアプリケーションはQtWebkitを使い、同時に複数のページを読み込むので、各Webページが独自のQNetworkAccessManagerを取得して、finished()シグナルが互いに干渉しないようにする必要があります。

3

複数のページをクロールするには、ライブラリにバンドルされているfollow.jsの例を参照してください。 https://github.com/ariya/phantomjs/blob/master/examples/follow.js

再帰を使用して、次のページをロードする前に現在のページが読み込まれるまで待つ必要があります。

+0

この例のような再帰呼び出しでない場合、少なくとも次のクロールをトリガーするコールバック。 –

+0

あなたのリンクは壊れています:( – Julien

関連する問題