我在phantomjs中打开多个网页时遇到了一些问题,我首先打开一个包含一些链接的网站,我想打开它,并将每个网址的一段文本保存到我的jobs_list中里面有很多物体。在运行了所有URL之后,我想退出phantomjs。但是现在它永远不会退出,我无法从第二个功能中接收数据。
var webPage = require('webpage');
var page = webPage.create();
var jobs_list = [];
page.open('url', function (status) {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() {
page.onConsoleMessage = function(msg) {
console.log(msg);
};
var list = page.evaluate(function() {
var jobs = [];
var job;
$('.test').each(function(){
$(this).find('span').each(function(){
var job_link = $(this).find('a');
var url = job_link.attr("href");
job = {title : job_link.text(), url : url, location : ""};
jobs.push(job);
})
});
return jobs;
});
var i = 0;
jobs_list = list;
next_page(i);
});
});
function next_page(i){
if (i <= (jobs_list.length-1)) {
var current_job = jobs_list[i];
var url = current_job.url;
page.open(url, function (status) {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function () {
var location = page.evaluate(function() {
var job_location;
$('.job-location').each(function(){
$(this).find('li').each(function(){
job_location = $(this).text();
})
})
console.log(job_location);
return job_location;
});
jobs_list[i].location = location;
if(i == (jobs_list.length-1)) {
phantom.exit(0);
}
});
});
console.log(i, current_job.title);
next_page(++i);
}
}
答案 0 :(得分:2)
问题是page.open
调用是异步的。如果仔细查看next_page
函数,可以将其缩短为:
function next_page(i){
if (i <= (jobs_list.length-1)) {
var current_job = jobs_list[i];
var url = current_job.url;
page.open(url, function (status) {
...
});
console.log(i, current_job.title);
next_page(++i);
}
}
这意味着在next_page(++i);
甚至设法加载第一个HTML内容之前执行page.open(url, ...)
。此调用导致下一个page.open(url, ...)
立即执行,从而覆盖先前的请求。而你永远不会以这种方式得到任何数据。
你必须做两件事:
next_page(++i);
调用我建议:
function next_page(i){
if (i <= (jobs_list.length-1)) {
var current_job = jobs_list[i];
var url = current_job.url;
page.open(url, function (status) {
page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function () {
var location = page.evaluate(function() {
var job_location;
$('.job-location').each(function(){
$(this).find('li').each(function(){
job_location = $(this).text();
})
})
console.log(job_location);
return job_location;
});
jobs_list[i].location = location;
console.log(i, current_job.title);
next_page(++i);
});
});
} else {
phantom.exit(0);
}
}
这是jQuery的旧版本。也许你想加载一个更新的版本。如果页面已经包含jQuery,您可能会通过加载另一个jQuery来破坏页面。在这种情况下,根本不要加载额外的jQuery版本。