【问题标题】:casper evaluate modifying global varcasper评估修改全局变量
【发布时间】:2013-04-24 21:58:14
【问题描述】:

我是 CasperJS 的新手,我遇到了 evaluate() 函数的问题。我有以下示例代码:

var results = [];  // a global var
var links = [link1, link2 ,....];  //a list of urls
var current = 0;

function search(url){
  this.start(url, function(){
    results = this.evaluate(function() { 
      var returnVal = [];
      //some code to store data into returnVal
      return returnVal;
      };
  })
}

function check(){
  if(current<7){
    this.echo('---Page' + (current + 1) + '---');
    search.call(this, links[current]);
    console.log(results.length);
    this.run(check);
    current++;
  } else{
    this.exit();
}

casper.start()
casper.then(function(){this.echo("starting");});
casper.run(check);

所以基本上代码应该从 7 个页面收集一些数据并将数据存储在全局 var 结果中。每页有 50 个要存储的数据。所以预期的输出是:

Starting
---Page1---
50
---Page2---
100
---Page3---
150
...

但实际输出是:

Starting
---Page1---
0
---Page2---
50
---Page3---
50
...

我预计每次迭代后结果的长度都会增加。但是,当我运行它时,结果的长度保持不变,这意味着在第一次迭代之后,它从未改变过。另外,我不明白为什么page1上的长度为0。我不知道为什么会这样。

【问题讨论】:

    标签: javascript web-scraping casperjs


    【解决方案1】:

    我认为这是因为每次运行测试时,都会重新分配全局“结果”。您需要附加到数组而不是在每一步之后重新分配它。像

    var tempResults = this.evaluate(function() {
        var returnVal = [];
        // load your data from the page
        return returnVal;
    };
    
    
    for(var i=0, j=tempResults.length; i < j; i++) {
        //append to global here
        results.push(tempResults[i]);
    }
    

    【讨论】:

    • 谢谢!这解决了我遇到的第一个问题。现在结果正在正确递增。但是,我仍然有两个问题:(1)我仍然不明白为什么 page1 显示 0 结果。在调用 check() 之后我有 print 语句,所以它应该已经执行一次。 (2) 似乎每个页面都返回相同的内容,而实际上应该是不同的。无论我传入的网址是什么,evaluate() 是否都会重新调整相同的内容?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多