CasperJS for循环在三个块中产生相同的结果 - 具有时间延迟

时间:2017-05-26 22:42:02

标签: javascript for-loop asynchronous web-scraping casperjs

我正在使用CasperJS来搜索网站以获取数据。我的程序在表中找到<a>标记,单击它,从新页面获取一些数据,返回上一页并重复下一个<a>标记的过程。

一切顺利,直到我偶然发现了最奇怪的问题:CasperJS for循环在三个块中产生相同的结果。无论第一次迭代返回什么,接下来的两次迭代都将返回相同的数据。它重复这个过程

示例

这个循环...

casper.then(function() {
  var i = 1;
  var j = 9;
  var bookingNumber = 0;
  var location = '';

  for (; i <= j;) {
    (function(index, max) {
      casper.then(function() {
        casper.waitForSelector(x('//*[@id="ListInmateNames"]/table'), function() {
          casper.click(x('//*[@id="ListInmateNames"]/table/tbody/tr[' + index + ']/td[1]/a'));
          this.echo('Loading details for inmate ' + index + ' of ' + max + '...', 'COMMENT');
        });
      });

      casper.then(function() {
        casper.waitForSelector(x('//*[@id="pnlResults"]/div[2]'), function() {
          bookingNumber = casper.fetchText(x('//*[@id="lblResults"]'));
          location = casper.fetchText(x('//*[@id="hlHousingLocation"]'));

          this.echo(bookingNumber);
          this.echo(location);
        });
      });

      casper.then(function() {
        casper.back();
      });

    })(i, j);

    i++;
  }
});

...产生此输出。

> Loading details for inmate 1 of 9... 2985842 Theo Lacy Facility

> Loading details for inmate 2 of 9... 2985842 Theo Lacy Facility

> Loading details for inmate 3 of 9... 2985842 Theo Lacy Facility

> Loading details for inmate 4 of 9...

> Loading details for inmate 5 of 9...

> Loading details for inmate 6 of 9...

> Loading details for inmate 7 of 9... 2993051 Central Mens Jail

> Loading details for inmate 8 of 9... 2993051 Central Mens Jail

> Loading details for inmate 9 of 9... 2993051 Central Mens Jail

是什么让它变得非常奇怪(以及我为什么这么问)

无论什么,它都会以三个的块的形式返回相同的数据。我坐了几百次迭代,它仍然产生相同的图案输出。我认为使用同步JavaScript运行的CasperJS的异步特性不会始终如一地产生这种模式。但确实如此。

有趣的是,输出块之间有一点延迟。程序将回显迭代1-3,然后等待一秒,然后回显迭代4-6,然后等待一秒钟。这是一贯的行为。

此外,在for循环中递增i ++计数器两次仍然会产生相同的三块图案输出行为,这意味着在循环中增加i ++两次产生这个输出......

> Loading details for inmate 1 of 9... 2985842 Theo Lacy Facility

> Loading details for inmate 3 of 9... 2985842 Theo Lacy Facility

> Loading details for inmate 5 of 9... 2985842 Theo Lacy Facility

...希望你明白了。

我尝试了什么

  • 将i ++计数器移至不同的代码块。
  • 将i ++计数器置于for循环中for (; i <= j; i++)并删除i++语句
  • 在不同的代码块中声明,初始化和重新分配四个变量(i,j,bookingNumber,location)
  • 使用constlet
  • 声明变量
  • 分别将indexmax重命名为ij
  • 删除for循环并对我的程序进行硬编码,该程序运行良好

TL; DR :我的CasperJS for循环始终以三个块的形式产生输出。第二次和第三次迭代的输出将是第一次迭代的输出。在任何情况下都不会改变。

如果有人能帮助我并阻止我自己开枪并结束我一直困扰着我的梦想的这个问题,那将是惊人的,我会亲自送你一个饼干。

0 个答案:

没有答案