您使用递归打开多个页面的想法是正确的,但是您遇到了一些问题.
出口
正如您所正确指出的,您遇到了phantom.exit()的问题.由于page.open()和setTimeout()是异步的,因此只需在完成后退出.当您在脚本末尾调用phantom.exit()时,您将在第一页加载之前退出.
只需删除最后一个phantom.exit(),因为您已经在正确的位置有另一个出口.
页面上下文
page.evaluate()提供对DOM上下文(页面上下文)的访问.问题是它是沙箱.在该回调内部,您无法访问外部定义的变量.您可以显式传递变量,但它们必须是原始对象,而页面则不是.您只需访问page.evaluate()内的页面即可.你需要在调用page.evaluate()之前注入jQuery.
档
您通过不更改文件名来覆盖每次迭代中的文件.您需要更改文件名或使用附加模式’a’而不是’w’.
然后,当您只想写一次时,您不需要打开流.更改:
var file = fs.open('new_test.txt', "w");
file.write(html + '\n');
file.close();
至
fs.write('new_test.txt', html + '\n', 'a');
递归步骤
调用next_page()函数的递归步骤要求您传入URL.由于url已经是一个全局变量,并且您在每次迭代中都更改它,因此您无需传入URL.
您也不需要添加setTimeout(),因为在page.open()回调内部之前的所有内容都是同步的.
修正脚本
//...
var urls = [/*....*/];
function handle_page(url){
page.open(url, function(){
//...
page.injectJs('jquery.min.js');
var html = page.evaluate(function(){
// ...do stuff...
return $('body').html();
});
//save to file
fs.write('new_test.txt', html + '\n', 'a');
console.log(html);
next_page();
});
}
function next_page(){
var url = urls.shift();
if(!url){
phantom.exit(0);
}
handle_page(url);
}
next_page();