Я долгое время отлаживал это, и это меня полностью сбило с толку. Мне нужно сохранить рекламу на моем компьютере для рабочего проекта. Вот пример рекламы, которую я получил от CNN.com:
Когда я перехожу по этой ссылке в Google Chrome и Firefox, я вижу рекламу (если ссылка перестает работать, просто перейдите на CNN.com и возьмите URL-адрес iframe для одного из объявлений). Я разработал сценарий PhantomJS, который сохранит снимок экрана и HTML любой страницы. Он работает на любом веб-сайте, но, похоже, не работает с такой рекламой. Снимок экрана пустой, а HTML-код содержит пиксель отслеживания (прозрачный GIF размером 1 x 1, используемый для отслеживания рекламы). Я думал, что это даст мне то, что я вижу в своем обычном браузере.
Единственное, о чем я могу думать, это то, что вызовы AJAX каким-то образом портят PhantomJS, поэтому я жестко запрограммировал задержку, но получил те же результаты.
Вот самый простой фрагмент тестового кода, который воспроизводит мою проблему:
var fs = require('fs');
var page = require('webpage').create();
var url = phantom.args[0];
page.open(url, function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
phantom.exit();
}
else {
// Output Results Immediately
var html = page.evaluate(function () {
return document.getElementsByTagName('html')[0].innerHTML;
});
fs.write("HtmlBeforeTimeout.htm", html, 'w');
page.render('RenderBeforeTimeout.png');
// Output Results After Delay (for AJAX)
window.setTimeout(function () {
var html = page.evaluate(function () {
return document.getElementsByTagName('html')[0].innerHTML;
});
fs.write("HtmlAfterTimeout.htm", html, 'w');
page.render('RenderAfterTimeout.png');
phantom.exit();
}, 9000); // 9 Second Delay
}
});
Вы можете запустить этот код с помощью этой команды в своем терминале:
phantomjs getHtml.js 'http://www.google.com/'
Вышеупомянутая команда работает хорошо. Когда вы заменяете URL-адрес Google на URL-адрес объявления (например, в верхней части этого сообщения), это дает мне неожиданные результаты, которые я объяснил.
Большое спасибо за Вашу помощь! Это мой первый вопрос, который я когда-либо задавал здесь, потому что я почти всегда могу найти ответ, выполнив поиск по переполнению стека. Однако этот меня полностью поставил в тупик! :)
РЕДАКТИРОВАТЬ: я запускаю PhantomJS 1.9.7 на Ubuntu 14.04 (Trusty Tahr)
РЕДАКТИРОВАТЬ: Хорошо, я работаю над этим некоторое время, и я думаю, что это как-то связано с файлами cookie. Если я очищаю всю историю и просматриваю ссылку в браузере, она также оказывается пустой. Если я затем обновлю страницу, все будет нормально. Он также отображается нормально, если я открываю его в новой вкладке. Единственный раз, когда этого не происходит, - это когда я пытаюсь просмотреть его сразу после очистки файлов cookie.
РЕДАКТИРОВАТЬ: я дважды пытался загрузить ссылку в PhantomJS, не выходя (вручную запрашивая ее дважды в моем сценарии перед вызовом phantom.exit ()). Не работает. В документации PhantomJS сказано, что по умолчанию cookie-файл включен. Любые идеи? :)