我正在开发一个小程序,它打开了大量的网页(根据从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标签而没有任何内容。
我认为这是因为我不是在等待当前页面正确且完整地加载。
所以我想知道是否有解决方案在每个"之间等待"迭代以获得整个页面并能够保存它?
答案 0 :(得分:1)
问题是循环执行是同步的,但page.open()
函数中的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();
答案 1 :(得分: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]);
});
}
享受!