2014-11-19 3 views
6

Я использую CapserJS 1.1.0-beta3 в сочетании с PhantomJS 1.8.2.Как предотвратить перенаправление в CasperJS?

Я вызываю URL-адрес, который отвечает перенаправлением (HTTP 302). 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?

Вы могли бы сделать то же самое, как со связанной PhantomJS версии непосредственно в CasperJS путем обмена page для casper.page, но CasperJS имеет несколько преимуществ. Вы можете добавить несколько обработчиков к тем же событиям с помощью нотации casper.on, и большинство из них вы можете решить, обрабатываются ли все ресурсы одинаково или просто загружаются страницы. Таким образом, вы можете обменять resource.received на page.resource.received и resource.requested на page.resource.requested.

+0

Спасибо! Я запускаю ваш скрипт с помощью CasperJS, но networkRequest.abort() не работает. Аргумент networkRequest, по-видимому, не определен. – Lavezzi

+0

Это, похоже, из-за вас старая версия PhantomJS (я только что попробовал). Я не знаю, из какой версии на это работает. Я настоятельно рекомендую вам обновить до более новой версии, такой как 1.9.8 –