如何防止CasperJS中的重定向?

Lav*_*zzi 6 javascript http phantomjs casperjs

我使用的是CapserJS 1.1.0-beta3和PhantomJS 1.8.2.

我调用一个响应重定向的URL(HTTP 302).PhantomJS自动跟随重定向,但在我的用例中,PhantomJS不应该遵循重定向.

重定向的调试输出如下所示:

[debug] [phantom] Navigation requested: url=https://foo.com/bar.jsp, type=Other, willNavigate=true, isMainFrame=true    
Run Code Online (Sandbox Code Playgroud)

如何配置PhantomJS/CapserJS不遵循重定向?

Art*_* B. 7

有一些必要的解决方法.因此,您需要首先确定哪个URL是重定向.有了resource.received您收到包含在它应该被重定向到URL的第一个请求的响应.但我们无法从这个事件处理程序做任何事情.因此,我们保存目标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();
});
Run Code Online (Sandbox Code Playgroud)

这是根据我的回答改编的:A:如何配置Poltergeist或PhantomJS不遵循重定向?

你可以做同样的与直接链接PhantomJS版本CasperJS通过交换pagecasper.page,但CasperJS有几个优点.您可以使用casper.on表示法向同一事件添加多个处理程序,并且大多数情况下您可以决定是以相同的方式处理所有资源还是仅处理页面加载.所以,你可以交换resource.receivedpage.resource.receivedresource.requestedpage.resource.requested.