2014-11-19 45 views
6

Tôi đang sử dụng CapserJS 1.1.0-beta3 kết hợp với PhantomJS 1.8.2.Làm thế nào để ngăn chặn chuyển hướng trong CasperJS?

Tôi gọi url trả lời bằng chuyển hướng (HTTP 302). PhantomJS tự động theo chuyển hướng, nhưng trong PhantomMS usecase của tôi không nên làm theo chuyển hướng.

Các debug đầu ra của chuyển hướng trông giống như:

[debug] [phantom] Navigation requested: url=https://foo.com/bar.jsp, type=Other, willNavigate=true, isMainFrame=true  

Làm thế nào tôi có thể cấu hình PhantomJS/CapserJS để không đi theo chuyển hướng?

Trả lời

7

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.receivedresource.requested cho page.resource.requested.

+0

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

+0

Đ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 –

Các vấn đề liên quan