如何防止CasperJS中的重定向?

时间:2014-11-19 15:54:11

标签: 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    

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

1 个答案:

答案 0 :(得分: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();
});

这是根据我的回答A: How to configure Poltergeist or PhantomJS to not follow redirects?

改编的

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