2013-07-29 25 views
7

私はCasperJSがリンクのarrayのすべてのリンクを開くようにしようとしています。私はリンクを開いた後、そのページのタイトルを表示するようにしています。しかし、私はそれを実行すると、何も表示されません。CasperJS - リンク配列内のすべてのリンクを開く方法

私はfor loopを使用してリンクを表示することができ、それは完全に動作します。

これは私が説明した何のためのコードです:

var x; 

casper.start(URL, function() { 
    x = links.split(" "); // now x is an array of links 
    this.exit(); 
}); 

for (var i = 0; j < x.length; i++) // for every link... 
{ 
    casper.thenOpen(partialURL + x[i], function() { // open that link 
     console.log(this.getTitle() + '\n'); // display the title of page 
    }); 
} 

casper.run(); 

をそれは未定義で 'X' と言う:

var x; 

casper.start(URL, function() { 

    x = links.split(" "); // now x is an array of links 

    for (var i = 0; j < x.length; i++) // for every link... 
    { 
     casper.thenOpen(partialURL + x[i], function() { // open that link 
      console.log(this.getTitle() + '\n'); // display the title of page 
     }); 
    } 

    this.exit(); 
}); 

casper.run(); 

これは私が試した別の方法です。しかし、xをグローバル変数に設定することに注意してください。 あなたができる変更はすばらしいことでしょう。ありがとう。

+0

私はちょうど私が持っていた唯一の問題は、このラインに気づいた: '(VAR I = 0; jの

+2

また、 'this.exit();'はスクリプトの出力を何も出力しないようです(私はそれを取り除くか、単に 'casper.then(function {){this.exit();})'に変更します)。私がそれらを変更すると、問題のコードが機能します。 –

答えて

7
var x; var i = -1; 

casper.start(URL, function() { 
    x = links.split(" "); // now x is an array of links 
}); 

casper.then(function() { 
    this.each(x, function() { 
     i++; // change the link being opened (has to be here specifically) 
     this.thenOpen((partialURL + x[i]), function() { 
      this.echo(this.getTitle()); // display the title of page 
     }); 
    }); 
}); 

casper.run(); 
0

このようなものを試してみてください。

var x; 

casper.start(URL, function() { 
    x = links.split(" "); // now x is an array of links 
}); 

casper.then(function() { 
    this.eachThen(x, function(response) { 
     this.thenOpen((partialURL + response.data), function() { 
      this.echo(this.getTitle()); // display the title of page 
     }); 
    }); 
}); 

casper.run(); 

x forループcasper.start前に実行されたため、未定義でした。 上記のコードでは、ブロックは、実行を遅らせるためにcasper.thenブロックの内側にネストされています。

+0

何も起こらない。 –

+1

私はあなたの答えを編集しようとしました、そして、私はそれがいくつかの奇妙な理由で否定されたと思います。 'var x;'の横に 'var i;'を追加して、 'console.log ...'の下に 'i ++;'を追加することもできますか? –

+0

リピートではなくeachThenを使うように変更しました。それは今働いているはずです – hexid

7
var i = 0; 
var nTimes = x.length; 

casper.repeat(nTimes, function() { 
    //... do your stuff 
    i++; 
}); 

は私のために働きました。

+0

私のためにも動作します。 –

1
casper.start(); 
casper.each(Object.keys(array), function(casper, array_elem) { 
    this.thenOpen(partialURL+array[attay_item], function() { 
     ... 
}; 

「未定義」というエラーです。これをあまり使わないでください。私はCasperJSで頻繁にこのエラーが発生するので、私はこれの代わりにcasperを書きます。

+0

'array'が実際の配列であれば、' array.forEach(function(item){casper.thenOpen(partial + item)}) 'を使う方が良いでしょう。 –

2

私の場合は、不明確なページ数のサイトを擦ってしまいました。各ページ(最後のページを除く)には<a class="next-page" href="/page/N">Next page</a>リンクがあります(Nはページ番号です)。 「次のページ」リンクが存在しなくなった場合を除いて、完了したタイミングをスクレーパーが知る方法はありませんでした。

もちろん、あなたのページにどのページングリンクが存在するかによって調整が必要です。

ここに私がしたことがあります。 Ymmv。

// imports 
var fs = require('fs'); 

// scraper state 
var state = {page: 1, data: []}; 

// casper 
var casper = require("casper").create(); 

// scraper function 
function scrape() { 
    this.echo('Scraping page ' + state.page + '...', 'INFO'); 

    state.data = state.data.concat(this.evaluate(function() { 
    // get some stuff from the page 
    return someData; 
    }); 

    var nextUrl = this.evaluate(function() { 
    var nextLink = document.querySelector("a.next-page"); 
    return nextLink && nextLink.href; 
    }); 

    if (nextUrl) { 
    state.page = state.page + 1; 
    casper.thenOpen(nextUrl, scrape); // <- recursion 
    } 
}); 

// run 
casper.run(function() { 
    fs.write('./data.json', JSON.stringify(state.data, null, '\t'), 'w'); 
    this.echo('Done!', 'INFO'); 
}); 

これは誰かを助けることを望みます。他にご質問がありましたら、お手伝いをしていきます。

0

私はこのコードで同じ問題を解決した:

casper.then(function() { 
    var i = -1; 
    this.eachThen(locations, function() { 
     i++; 
     //Do stuff here like for example: 
     this.thenOpen(YOUR_URL, function() { 
      this.waitForSelector("MYSELECTOR", 
      function() { 

      },     
      function() { 

      }) 
     }); 
    }) 
}); 
5
casper.start('about:blank'); 

var urls = ['http://google.fr', 'http://yahoo.fr', 'http://amazon.fr']; 

casper.each(urls, function(casper, url) { 
    casper.thenOpen(url, function() { 
     this.echo("I'm in your " + url + "."); 
    }); 
}); 
関連する問題