将一个值从phantomjs返回到nodejs

时间:2015-02-27 18:24:19

标签: node.js web-scraping phantomjs cheerio

我正在使用jquerygo库使用phantomjs,我正在尝试这个。

  1. 访问网址
  2. 点击链接并等待其加载
  3. 获取特定标记并将其返回到nodejs进行处理。
  4. 我在phantomjs中意识到:

      

    执行是沙盒,网页无法访问幻像对象,无法探测自己的设置

    但是我应该能够从评估中返回一个简单的字符串吗? 但这不起作用。我的代码如下:

    var photogsScrapeCount = function(url, callback){
    console.log("LOADED PHOTOGSSCRAPE Count");
    url = decodeURIComponent(url);
    //$.config.site = 'https://www.magnumphotos.com/';
    $.config.addJQuery = false;
    $.visit(url, function() {
        $.waitForElement(".7n7np102",function() {
            $.getPage(function(page) {
                var imgCounterMinus = page.evaluate(function(){
                $(".7n7np102 a").click(); // open the image enlarge
                var temp = setTimeout(function(){
                    imgCounterMinus1 = $("span[id$='TotalPageCount_Lbl']").html();
                    imgCounterMinus1 = imgCounterMinus1.split(" ");
                    imgCounterMinus1 = imgCounterMinus1[2];
                    imgCounterMinus1 = parseInt(imgCounterMinus1);
                    console.log("imgCounterMinus1" + imgCounterMinus1);
                    return (imgCounterMinus1 - 3);
                }, 4000);
                return temp;
                }); 
                //console.log("After evaluate: " + imgCounterMinus)
            });
        });
    });
    };
    

    这可以通过任何不同的方式实现吗?网站的基本示例正在运行,所以我假设setTimeout给我带来了问题。 任何想法或建议都会非常有用,因为我在编写jquery,Js。

    方面经验很少

1 个答案:

答案 0 :(得分:0)

docs say(强调我的):

  

首先,这个库不是jQuery的完整API镜像。每个API 异步(由于它与Phantom.js的交互),因此存在一些差异。

还有一个例子必须如何使用page.evaluate()。结果未返回,但传递给第二个回调。除了使用回调之外,没有办法从函数的异步执行中返回一些东西。所以setTimeout语法也是错误的。

$(".7n7np102 a").click(function(){
    setTimeout(function(){
        $.getPage(function(page) {
            page.evaluate(function(){
                var imgCounterMinus1 = $("span[id$='TotalPageCount_Lbl']").html();
                imgCounterMinus1 = imgCounterMinus1.split(" ");
                imgCounterMinus1 = imgCounterMinus1[2];
                imgCounterMinus1 = parseInt(imgCounterMinus1);
                console.log("imgCounterMinus1" + imgCounterMinus1);
                return (imgCounterMinus1 - 3);
            }, function(err, result){
                console.log("After evaluate: " + result);
                callback();
                $.close();
            });
        });
    }, 4000);
});