2015-05-14 104 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]); 
    }); 
} 

享受!