[英]Wait for the end of a function execution in a PhantomJS script
我正在开发一个小的程序,它将打开大量网页(根据从id.txt中获取的ID)并将其保存在文件中。
var page = require('webpage').create();
var fs = require('fs');
var file_h = fs.open('id.txt', 'r'); // contains data like : myName-1111
var line = file_h.readLine();
while(line) {
data = line.split("-");
line = file_h.readLine();
savePage(data[1]);
}
function savePage(id){
page.open('http://www.myWebsite.com/'+id, function(){
page.evaluate();
fs.write("page/"+id+'.html', page.content, 'w');
});
}
file_h.close();
phantom.exit();
目前,我仅保存此html,head和body标签,而没有任何内容。
我认为这是由于我没有等待当前页面正确正确地加载而导致的。
所以我想知道是否有解决方案可以在每次“ for”迭代之间等待以获取完整页面并能够保存它?
问题是循环执行是同步的,但savePage
函数中的page.open()
调用savePage
是。 执行循环时,页面未完全加载,因为触发了下一个打开的页面。
您可能会认为最后一页将被完全加载,但事实并非如此,因为您使用phantom.exit()
退出得太早了。
JavaScript没有睡眠功能。 等待/睡眠是异步完成的。 解决此问题的唯一方法是使用递归。
将while循环的内容page.open()
调用内,然后删除循环。 然后调用该函数。 您还需要将完成条件也移到page.open()
调用中:
var page = require('webpage').create();
var fs = require('fs');
var file_h = fs.open('id.txt', 'r'); // contains data like : myName-1111
function traverse(){
var line = file_h.readLine();
if (!line) {
file_h.close();
phantom.exit();
}
page.open('http://www.myWebsite.com/'+id, function(){
var data = line.split("-");
traverse();
fs.write("page/"+data[1]+'.html', page.content, 'w');
});
}
traverse();
最后,我编写了一个正在运行的程序。
这是代码:
var page = require('webpage').create();
var fs = require('fs');
var file_h = fs.open('id.txt', 'r');
var line = file_h.readLine();
data = line.split("-");
console.log("Reading id : "+data[1]);
savePage(data[1]);
function savePage(id){
console.log("\n#### READING http://www.myWebsite.com/"+ id +" ####")
page.open('http://www.myWebsite.com/'+id, function(){
page.evaluate(function(){
});
console.log("#### WRITING "+ id +".html ####")
fs.write("page/"+id+'.html', page.content, 'w');
line = file_h.readLine();
if(line == ""){
phantom.exit();
}
data = line.split("-");
savePage(data[1]);
});
}
请享用 !
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.