Phantomjs开了很多页

时间:2016-09-05 15:14:42

标签: javascript phantomjs

我在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);
    }
}

1 个答案:

答案 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版本。