CasperJS循环加载下一页

时间:2013-11-02 21:50:50

标签: javascript screen-scraping casperjs

我一直在编写一个脚本,用于整理网站用户列表的分数。但有一个问题是,我正在尝试在while循环中加载下一页,但是函数没有被加载......

casper.then(function () {
    var fs = require('fs');
    json = require('usernames.json');

    var length = json.username.length;
    leaderboard = {};
    for (var ii = 0; ii < length; ii++) {
        var currentName = json.username[ii];
        this.thenOpen("http://www.url.com?ul=" + currentName + "&sortdir=desc&sort=lastfound", function (id) {
                return function () {
                    this.capture("Screenshots/" + json.username[id] + ".png");
                    if (!casper.exists(x("//*[contains(text(), 'That username does not exist in the system')]"))) {

                        if (casper.exists(x('//*[@id="ctl00_ContentBody_ResultsPanel"]/table[2]'))) {
                            this.thenEvaluate(tgsagc.tagNextLink);

                            tgsagc.cacheCount = 0;
                            tgsagc.
                            continue = true;
                            this.echo("------------ " + json.username[id] + " ------------");
                            while (tgsagc.
                                continue) {
                                this.then(function () {
                                    this.evaluate(tgsagc.tagNextLink);
                                    var findDates, pageNumber;
                                    pageNumber = this.evaluate(tgsagc.pageNumber);
                                    findDates = this.evaluate(tgsagc.getFindDates);
                                    this.echo("Found " + findDates.length + " on page " + pageNumber);
                                    tgsagc.checkFinds(findDates);
                                    this.echo(tgsagc.cacheCount + " Caches for " + json.username[id]);
                                    this.echo("Continue? " + tgsagc["continue"]);
                                    this.click("#tgsagc-link-next");


                                });

                            }

                            leaderboard[json.username[id]] = tgsagc.cacheCount;
                            console.log("Final Count: " + leaderboard[json.username[id]]);
                            console.log(JSON.stringify(leaderboard));
                        } else {
                            this.echo("------------ " + json.username[id] + " ------------");
                            this.echo("0 Caches Found");
                            leaderboard[json.username[id]] = 0;
                            console.log(JSON.stringify(leaderboard));

                        }


                    } else {
                        this.echo("------------ " + json.username[id] + " ------------");
                        this.echo("No User found with that Username");
                        leaderboard[json.username[id]] = null;
                        console.log(JSON.stringify(leaderboard));

                    }
                });

2 个答案:

答案 0 :(得分:0)

while (tgsagc.continue) {
    this.then(function(){
        this.evaluate(tgsagc.tagNextLink);
        var findDates, pageNumber;
        pageNumber = this.evaluate(tgsagc.pageNumber);
        findDates = this.evaluate(tgsagc.getFindDates);
        this.echo("Found " + findDates.length + " on page " + pageNumber);
        tgsagc.checkFinds(findDates);
        this.echo(tgsagc.cacheCount + " Caches for " + json.username[id]);
        this.echo("Continue? " + tgsagc["continue"]);
        return this.click("#tgsagc-link-next");
    });
}

好的,看看这段代码我可以建议你做一些改变:

  1. 我认为你不应该在then()中的函数内调用return。这可能会过早地终止功能。查看casperjs documentation,示例也不会返回任何内容。
  2. 在你的while循环中,什么将“tgsagc.continue”设置为false?
  3. 请勿使用“continue”作为变量名称。它是Javascript中的reserved word,用于终止循环的迭代。在你的情况下,这应该不是问题,但无论如何都是不好的做法。
  4. 不要在调用then()函数时不断重新定义方法。重构您的代码,以便在其他地方定义一次。

答案 1 :(得分:0)

我们最终必须对函数进行范围调整,因此它会在循环中加载下一页。

这主要是因为CasperJS不是为计算得分而设计的,它试图异步进行计算,缺少所需的功能