2013-06-26 100 views
1

我想使用phantomjs截圖很多頁面。屏幕截圖很多網頁

的問題是如何處理,如果我有1000多頁,因爲在下面的代碼當下崩潰phantomjs:

這是aobj一個例子:

var aobj = '[{"kb":21.047829999999976,"jb":52.174250000000015,"ff":110.16456426650427},{"kb":21.047997078651633,"jb":52.17421235955058,"ff":110.16456426650427},{"kb":21.048164157303404,"jb":52.17417471910114,"ff":110.16456426650427},{"kb":21.04833123595506,"jb":52.1741370786517,"ff":110.16456426650427},{"kb":21.048498314606718,"jb":52.174099438202255,"ff":110.16456426650427},{"kb":21.04866539325849,"jb":52.17406179775282,"ff":110.16456426650427},{"kb":21.048832471910146,"jb":52.17402415730338,"ff":110.16456426650427},{"kb":21.048999550561803,"jb":52.173986516853944,"ff":110.16456426650427}]' 

...和代碼的更

休息:

aobj = JSON.parse(aobj); 

function tes_par(nrr,jbb,kkb,hhf) 
{ 
var page = require('webpage').create(); 
page.viewportSize = { width: 600, height: 480 }; 
console.log(nrr); 
page.open('http://maps.googleapis.com/maps/api/streetview?size=640x480&location='+jbb+','+kkb+'&pitch=-0.760&sensor=false&heading='+hhf, function() 
{ 
    page.render(nrr + '.png');  
}); 
} 

for (var i=0;i<aobj.length;i++) 
{ 
tes_par(i,aobj[i].jb,aobj[i].kb,aobj[i].ff); 
} 

我認爲這是因爲JS一次只能運行一個代碼,所以它會佔用所有資源,但我不知道如何等待page.openpage.render並等待有多於1000個這些功能的調用。

我還試圖用setTimeout的,但同樣沒有成功:

aobj = JSON.parse(aobj); 

function tes_par(nrr,jbb,kkb,hhf) 
{ 
var page = require('webpage').create(); 
page.viewportSize = { width: 600, height: 480 }; 
console.log(nrr); 
page.open('http://maps.googleapis.com/maps/api/streetview?size=640x480&location='+jbb+','+kkb+'&pitch=-0.760&sensor=false&heading='+hhf, function() 
{ 
    page.render(nrr + '.png');  
}); 
} 


function aa_bb(ii) 
{ 
var jj=0; 
(ii+500<aobj.length) ? jj=ii+500 : jj=aobj.length; 
for (var i=ii;i<jj;i++) 
{ 
tes_par(i,aobj[i].jb,aobj[i].kb,aobj[i].ff); 
} 
}; 

aa_bb(1); 
setTimeout(function(){aa_bb(501)},120000); 
+0

對不起,我沒有在幻影js工作。你正在節點中運行這個腳本吧?你可以使用某種類型的隊列,以便一次只傳遞一個請求嗎? – karthick

+0

是的,我一直在想這個。不幸的是,我的隊列實現不起作用:(。 – Tom

回答

2

嘗試調用後,每個渲染page.close()docs提到重新使用同一個對象而不關閉可以防止垃圾收集。

+0

相同的結果 - 執行page.close()之前phantomjs崩潰,因爲page.open()調用太多 – Tom

2

請參閱Using Multiple page.open in Single Script。基本的想法是,你打開傳遞給前一頁打開的函數結尾處的下一頁。否則,你會立即打開一大堆頁面,併發生混亂。

aobj = JSON.parse(aobj); 
var page = require('webpage').create(); 
page.viewportSize = { width: 600, height: 480 }; 

function tes_par(nrr,jbb,kkb,hhf) 
{ 
    console.log(nrr); 
    page.open(
     'http://maps.googleapis.com/maps/api/streetview?size=640x480&location='+jbb+','+kkb+'&pitch=-0.760&sensor=false&heading='+hhf, 
     function() 
     { 
      page.render(nrr + '.png'); 
      setTimeout(function(){next_thingie(nrr+1);},100); 
     } 
    ); 
} 

function next_thingie(i) 
{ 
    if(i>=aobj.length){return;} 
    tes_par(i,aobj[i].jb,aobj[i].kb,aobj[i].ff); 
} 

next_thingie(0); 

更新

上面的代碼已經從早期版本改變了,之後我回顧我自己的代碼(工作),並發現我沒有正確地應用它解決這個問題。更改包括:

  1. 僅創建頁面一次。

  2. 使遞歸調用下一頁page.open函數。

  3. 使用一點暫停來幫助PhantomJS屏住呼吸。

這種方法適用於從約80個文件中捕獲約300個屏幕截圖。

+0

它不起作用; /。console。日誌(nrr)僅打印「0」,然後崩潰 – Tom

+0

'i'在錯誤的地方遞增並且從未到達。請參閱我的編輯。 – 2013-07-02 12:48:13

+0

i = 1200周圍的東西我得到_ [CRITICAL] QThread :: start:Failed創建thread_和phantomjs崩潰,而且,它迭代'i'的速度太快,phantomjs沒有時間來保存png文件(當然)。 – Tom