我正在尝试将源代码同时提取到多个网页。这些链接通过源文本文件输入到数组中。我能够迭代数组并打印出链接并确认它们存在,但是当尝试通过函数传递它们时,它们在第一次迭代后变得未定义。
我的最终目标是将每个页面的源代码保存到自己的文档中。它正确执行第一页,但后续尝试未定义。我已经搜索了几个小时,但如果有人能指出我正确的方向,我将不胜感激。
var fs = require('fs');
var pageContent = fs.read('input.txt');
var arrdata = pageContent.split(/[\n]/);
var system = require('system');
var page = require('webpage').create();
var args = system.args;
var imagelink;
var content = " ";
function handle_page(file, imagelink){
page.open(file,function(){
var js = page.evaluate(function (){
return document;
});
fs.write(imagelink, page.content, 'w');
setTimeout(next_page(),500);
});
}
function next_page(imagelink){
var file = imagelink;
if(!file){phantom.exit(0);}
handle_page(file, imagelink);
}
for(var i in arrdata){
next_page(arrdata[i]);
}
我现在意识到 for 循环只会迭代一次,然后其他两个函数会创建自己的循环,所以这是有道理的,但在运行它时仍然存在问题。
PhantomJS 的page.open()
是异步的(这就是为什么有回调)。另一件事是page.open()
是一个漫长的操作。如果进行两次此类调用,第二次调用将覆盖第一个调用,因为您正在同一台计算机上进行操作page
object.
最好的方法是使用递归:
function handle_page(i){
if (arrdata.length === i) {
phantom.exit();
return;
}
var imageLink = arrdata[i];
page.open(imageLink, function(){
fs.write("file_"+i+".html", page.content, 'w');
handle_page(i+1);
});
}
handle_page(0);
其他一些事情:
-
setTimeout(next_page(),500);
立即调用next_page()
无需等待。你自找的setTimeout(next_page, 500);
,但是这样也行不通,因为没有参数next_page
只需退出即可。
-
fs.write(imagelink, page.content, 'w')
that imagelink
可能是一个 URL,在这种情况下,您可能想要定义另一种方式来设计文件名。
- While
for(var i in arrdata){ next_page(arrdata[i]); }
在这里工作请注意,这不适用于所有数组和类似数组的对象。使用愚蠢的 for 循环,例如for(var i = 0; i < length; i++)
or array.forEach(function(item, index){...})
如果有的话。
-
page.evaluate()
是沙箱并提供对 DOM 的访问,但所有不可 JSON 序列化的内容都无法从中传递出去。在将其传递出去之前,您必须将其转换为可序列化的格式evaluate()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)