2013-07-29 25 views
7

Tôi đang cố gắng để CasperJS mở mỗi liên kết trong một liên kết array. Tôi có nó để sau khi tôi mở một liên kết, nó sẽ hiển thị tiêu đề của trang đó. Tuy nhiên, khi tôi chạy nó, không có gì được hiển thị.CasperJS - Cách mở tất cả các liên kết trong một dãy các liên kết

Tôi có thể sử dụng for loop để hiển thị các liên kết và nó hoạt động hoàn hảo.

Đây là mã cho những gì tôi chỉ giải thích:

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

Đây là một phương pháp tôi đã cố gắng:

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

Nó nói rằng 'x' trong không xác định. Lưu ý rằng tôi đặt x là biến toàn cầu. Mọi sửa đổi mà bạn có thể thực hiện sẽ rất tuyệt vời. Cảm ơn.

+0

Tôi chỉ nhận ra vấn đề duy nhất mà tôi đã có được dòng này: 'for (var i = 0; j

+2

Ngoài ra, 'this.exit();' dường như làm cho đầu ra kịch bản không có gì (tôi có thể lấy nó đi hoặc chỉ thay đổi nó thành 'casper.then (function() {this.exit();});'). Nếu tôi thay đổi, mã trong câu hỏi sẽ hoạt động. –

Trả lời

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

Hãy thử một cái gì đó như thế này.

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 không xác định vì vòng lặp for đã được thực thi trước casper.start. Trong đoạn mã trên, khối eachThen() được lồng bên trong khối casper.then để trì hoãn việc thực thi.

+0

Không có gì xảy ra. –

+1

Tôi đã thử chỉnh sửa câu trả lời của bạn và tôi đoán nó đã bị từ chối vì một lý do kỳ lạ nào đó. Bạn có thể thêm 'var i;' bên cạnh 'var x;', và bạn cũng có thể thêm 'i ++;' bên dưới 'console.log ...' –

+0

Tôi đã thay đổi nó để sử dụng mỗiSau đó thay vì lặp lại.Nó sẽ hoạt động ngay bây giờ – hexid

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

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

làm việc cho tôi.

+0

Làm việc cho tôi. –

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

Và về lỗi "không xác định". Cố gắng không sử dụng quá nhiều. Tôi gặp lỗi này với CasperJS thường xuyên, vì vậy tôi thích viết casper thay vì điều này.

+0

Nếu 'mảng' là một mảng thực, thì tốt hơn nên sử dụng' array.forEach (hàm (item) {casper.thenOpen (partial + item)}) '. –

2

Trong trường hợp của tôi, tôi phải xóa một trang web có số lượng trang không xác định. Mỗi trang (trừ trang cuối) có liên kết <a class="next-page" href="/page/N">Next page</a> (trong đó N là số trang). Không có cách nào để scraper biết khi nào nó kết thúc trừ khi liên kết "Next Page" không còn tồn tại nữa.

Tất nhiên bạn sẽ phải thực hiện điều chỉnh tùy thuộc vào loại liên kết pagination nào có thể tồn tại trên trang của bạn.

Đây là những gì tôi đã làm. 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'); 
}); 

Hy vọng điều này sẽ giúp ai đó. Nếu bạn có câu hỏi khác, tôi sẽ rất vui khi được giúp đỡ.

0

Tôi đã giải quyết vấn đề tương tự với mã này:

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 + "."); 
    }); 
});