默认情况下,PhantomJS 的虚拟屏幕大小为 400x300。
var page = require('webpage').create();
console.log(page.viewportSize.width);
console.log(page.viewportSize.height);
400
300
有些网站注意到了这一点,而不是您在桌面浏览器中看到的普通版本,它们提供了 HTML 和 CSS 的移动、剥离版本。但是我们可以通过设置所需的视口大小来解决这个问题:
page.viewportSize = { width: 1280, height: 800 };
还有一些网站会进行用户代理嗅探并基于此做出决策。如果他们不了解您的浏览器,他们可以显示移动版本以确保安全,或者如果他们不想被抓取,他们可以拒绝与 PhantomJS 的连接,因为它诚实地声明了自己:
console.log(page.settings.userAgent);
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.1.1 Safari/538.1
但我们可以设置所需的用户代理:
page.settings.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0';
在处理如此脆弱的事物和网络抓取时,您真的应该注意您可以获得的任何错误和系统消息。
所以任何 PhantomJS 脚本都不应该没有 onError 和 onConsoleMessage 回调:
page.onError = function (msg, trace) {
var msgStack = ['ERROR: ' + msg];
if (trace && trace.length) {
msgStack.push('TRACE:');
trace.forEach(function(t) {
msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function +'")' : ''));
});
}
console.log(msgStack.join('\n'));
};
page.onConsoleMessage = function (msg) {
console.log(msg);
};
PhantomJS 脚本调试的另一个重要技术是截屏。您确定 PhantomJS 可以看到您在 Chrome 中看到的内容吗?
page.render("google.com.png");
在设置用户代理之前:
设置 Firefox 用户代理后