Существует небольшое обходное решение. Поэтому вам нужно сначала определить, какой 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
.
Спасибо! Я запускаю ваш скрипт с помощью CasperJS, но networkRequest.abort() не работает. Аргумент networkRequest, по-видимому, не определен. – Lavezzi
Это, похоже, из-за вас старая версия PhantomJS (я только что попробовал). Я не знаю, из какой версии на это работает. Я настоятельно рекомендую вам обновить до более новой версии, такой как 1.9.8 –