Có một chút giải pháp cần thiết. Vì vậy, trước tiên bạn cần xác định URL nào là chuyển hướng. Với resource.received
bạn nhận được phản hồi cho yêu cầu đầu tiên chứa URL mà nó sẽ được chuyển hướng đến. Nhưng chúng tôi không thể làm bất cứ điều gì từ xử lý sự kiện này. Do đó, chúng tôi lưu URL mục tiêu được xác định là mục tiêu chuyển hướng cho sau này.
Bây giờ trình duyệt không có dấu cơ bản (PhantomJS hoặc SlimerJS) theo sau chuyển hướng bằng cách yêu cầu tài nguyên mới, nhưng bây giờ resource.requested
cung cấp cho chúng tôi các công cụ để hủy yêu cầu (đáng buồn là điều này không được ghi trong CasperJS). Vì vậy, các kịch bản cuối cùng trông như thế này:
var casper = require("casper").create();
var redirectURLs = [],
doLog = true;
casper.on("resource.requested", function(requestData, networkRequest){
if (doLog) console.log('Request (#' + requestData.id + '): ' + JSON.stringify(requestData) + "\n");
if (redirectURLs.indexOf(requestData.url) !== -1) {
// this is a redirect url
networkRequest.abort();
}
});
casper.on("resource.received", function(response){
if (doLog) console.log('Response (#' + response.id + ', stage "' + response.stage + '"): ' + JSON.stringify(response) + "\n");
if (response.status === 301) { // use your status here
redirectURLs.push(response.redirectURL);
}
});
casper.start("https://stackoverflow.com/q/27021176").run(function(){
this.echo("DONE");
this.exit();
});
này được chuyển thể từ câu trả lời của tôi A: How to configure Poltergeist or PhantomJS to not follow redirects?
Bạn có thể làm tương tự như với PhantomJS phiên bản liên kết trực tiếp trong CasperJS bằng cách trao đổi page
cho casper.page
, nhưng CasperJS có ít ưu điểm. Bạn có thể thêm nhiều trình xử lý cho cùng một sự kiện với ký hiệu casper.on
và hầu hết tất cả các bạn đều có thể quyết định xem tất cả các tài nguyên có được xử lý theo cùng một cách hay chỉ tải trang. Vì vậy, bạn có thể trao đổi resource.received
cho page.resource.received
và resource.requested
cho page.resource.requested
.
Nguồn
2014-11-20 11:00:40
Cảm ơn bạn! Tôi đã chạy kịch bản của bạn với CasperJS nhưng networkRequest.abort() không hoạt động. Đối số networkRequest dường như không xác định. – Lavezzi
Điều đó có vẻ là do bạn phiên bản cũ của PhantomJS (Tôi chỉ thử nó ra). Tôi không biết phiên bản này hoạt động ở đâu. Tôi khuyên bạn nên cập nhật lên phiên bản mới hơn như 1.9.8 –