8

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

a を使用しfor loopてリンクを表示でき、完全に機能します。

これは、今説明したコードです。

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();

これは私が試した別の方法です:

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」は未定義です。ただし、x をグローバル変数に設定していることに注意してください。あなたが行うことができる変更は素晴らしいでしょう。ありがとう。

4

7 に答える 7

8
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();
于 2013-07-29T22:20:36.837 に答える
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 + ".");
    });
});
于 2016-05-09T15:52:00.563 に答える
2

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

もちろん、ページに存在する可能性のあるページネーション リンクの種類に応じて調整を行う必要があります。

これが私がしたことです。うーん。

// 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');
});

これが誰かに役立つことを願っています。他にもご不明な点がございましたら、お気軽にお問い合わせください。

于 2015-07-08T20:09:16.653 に答える
1
casper.start();
casper.each(Object.keys(array), function(casper, array_elem) {
    this.thenOpen(partialURL+array[attay_item], function() {
        ...
};

そして「未定義」エラーについて。これを使いすぎないようにしてください。CasperJS でこのエラーが頻繁に発生するため、この代わりに casper を記述することを好みます。

于 2015-01-08T17:01:08.280 に答える
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();

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

于 2013-07-29T17:18:05.570 に答える