Screenshoting many webpages
我想使用 phantomjs 截取许多页面。
问题是如果我的页面数超过 1000,如何处理,因为目前以下代码崩溃 phantomjs:
这是一个 aobj 的例子:
1 | 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}]' |
...还有更多
其余代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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,但还是没有成功:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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); |
请参阅在单个脚本中使用多个 page.open。基本思想是,你在打开下一页的末尾将函数传递给打开的上一页。否则,您会同时打开一堆页面,然后就会出现混乱。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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); |
更新
在我查看了自己的代码(有效)并发现我没有正确地将其应用于此问题之后,上面的代码已从早期版本中更改。更改包括:
只创建一次页面。
在
应用一点超时来帮助 PhantomJS 喘口气。
这种方法适用于我从大约 80 个文件中捕获大约 300 个屏幕截图。
尝试在每次渲染后调用