繁体   English   中英

如何防止CasperJS中的重定向?

[英]How to prevent redirects in 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    

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

有一些必要的解决方法。 因此,您需要首先确定哪个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();
});

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM