2014-11-19 4 views
6

저는 PhantomJS 1.8.2와 결합 된 CapserJS 1.1.0-beta3을 사용하고 있습니다.CasperJS에서 리디렉션을 방지하는 방법은 무엇입니까?

리디렉션 (HTTP 302)으로 응답하는 URL을 호출합니다. PhantomJS는 자동으로 리디렉션을 따르지만 PhantomJS는 리디렉션을 따르지 않아야합니다.

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

가 어떻게 PhantomJS/CapserJS 리디렉션을 수행하지 않도록 구성 할 수 있습니다처럼

리디렉션의 디버그 출력이 보인다?

답변

7

약간의 해결 방법이 필요합니다. 따라서 어떤 URL이 리디렉션인지 먼저 확인해야합니다. resource.received으로 리디렉션되어야하는 URL이 포함 된 첫 번째 요청에 대한 응답을받습니다. 그러나 우리는이 이벤트 핸들러에서 아무 것도 할 수 없습니다. 따라서 나중에 리디렉션 대상으로 식별 된 대상 URL을 저장합니다.

이제 기본 헤드리스 브라우저 (PhantomJS 또는 SlimerJS)가 새 리소스를 요청하여 리디렉션을 수행하지만 이제는 resource.requested이 요청을 중단 할 수있는 도구를 제공합니다 (슬프게도 CasperJS에서는 설명하지 않습니다). 그래서 최종 스크립트는 다음과 같습니다

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

이 내 대답에서 적응 A: How to configure Poltergeist or PhantomJS to not follow redirects?

당신은 casper.page에 대한 page를 교환하여 CasperJS에 직접 연결 PhantomJS 버전으로 동일한 기능을 수행 할 수 있지만, CasperJS이있다

몇 가지 장점. casper.on 표기법을 사용하여 동일한 이벤트에 여러 핸들러를 추가 할 수 있으며 모든 리소스가 동일한 방식으로 처리되거나 페이지로드 만 처리되는 경우 대부분 결정할 수 있습니다. 따라서 page.resource.requested의 경우 page.resource.receivedresource.requested의 경우 resource.received을 교환 할 수 있습니다.

+0

고맙습니다! CasperJS로 스크립트를 실행했지만 networkRequest.abort()가 작동하지 않습니다. NetworkRequest 인수는 정의되지 않은 것처럼 보입니다. – Lavezzi

+0

PhantomJS의 구버전 인 것 같습니다. (방금 해보기로했습니다.) 나는이 작품의 어떤 버전인지 모른다. 1.9.8과 같은 최신 버전으로 업데이트 하시길 강력히 권합니다. –

관련 문제