我想用幻影截图很多网页。
问题是,如果我有超过1000页的页面,那么如何处理呢?因为目前,下面的代码崩溃了幻影:
这是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.open和page.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);发布于 2013-06-26 10:30:14
试着在每次呈现后调用page.close()。文档提到在不关闭的情况下重用同一个对象可以防止垃圾回收。
发布于 2013-06-30 20:52:24
见在单个脚本中使用多个page.open。基本思想是,您打开下一页时,将函数的末尾传递给上一页打开。否则,你会立刻打开一堆页面,随后就会发生混乱。
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);更新
上面的代码已经从以前的版本中改变了,因为我检查了我自己的代码(这很有效),发现我没有正确地将它应用到这个问题上。变动包括:
page.open函数中递归调用下一页page.open。这种方法适用于我从大约80个文件中获取大约300个屏幕截图。
https://stackoverflow.com/questions/17317501
复制相似问题