2015-05-14 76 views
0

我在其上开扩网页的一个大数目了一个小程序的工作函数执行结束,并将其保存在一个文件中。等待在PhantomJS脚本

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标签,没有任何内容。

我认为这是由于这样的事实,我不等待当前页面,准确,完整地进行负载。

所以我想知道是否有一个解决方案的每个“为”迭代之间等待来获得完整的网页,并能保存呢?

回答

1

问题是循环执行是同步的,但调用savePage函数不是。循环执行时,页面未完全加载,因为下一页打开被触发。

你可能会认为最后一页将满载,但它不是,因为你与phantom.exit()太早退出。

JavaScript没有睡眠功能。等待/休眠是异步完成的。解决这个问题的唯一方法是使用递归。

移动page.open()调用内部while循环的内容和消除环路。然后调用该函数。您需要也移动结束条件进入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(); 
0

我,终于,写这是工作的程序。

下面是代码:

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]); 
    }); 
} 

享受!