【发布时间】:2014-11-09 17:19:01
【问题描述】:
我正在使用以下代码使用 phantomjs 截取页面的屏幕截图。它适用于大多数页面,但对某些 URL 显示“操作已取消”错误。
var page = require('webpage').create(),
system = require('system');
page.viewportSize = {
width: 1366,
height: 800
};
page.onConsoleMessage = function(msg) {
console.log("CONSOLE MESSAGE:" + msg);
};
page.onResourceError = function(resourceError) {
console.log('Unable to load resource (#' + resourceError.id + 'URL:' + resourceError.url + ')');
console.log('Error code: ' + resourceError.errorCode + '. Description: ' + resourceError.errorString);
};
page.open(<URL>, function(status) {
if (status !== 'success') {
console.log('FAIL to load the address');
phantom.exit();
} else {
page.render("3.png");
phantom.exit();
}
});
console.log("opening");
一些无效的 URL 示例包括:http://india.gov.in、http://timesofindia.indiatimes.com/ 等。
对于india.gov.in,对 url 的第一个请求:http://india.gov.in/ 正在中途重新发送,并且所有现有操作在它之前被取消。其他一些 URL 也会发生类似的情况。
页面是否正在刷新?如果是,我该如何处理?
如何在 phantomjs 中跟踪重定向/重新加载?
进一步的调查给了我一些更有趣的统计数据。在 india.gov.in 期间,phantomjs 在某一时刻开始发送请求和接收响应(在发出请求 ID:118 之后),待处理请求的数量为 37。幻影“取消”了待处理的请求并从头开始加载页面。它再次开始发送请求。
在请求 id 156 之后,待处理请求的数量再次变为 37(这次它只收到了一个请求的响应)。所以它再次“取消”了所有未决的请求,重新开始。
在请求 id 194 之后,待处理请求的数量再次变为 37,因此它再次取消并重新启动。
在请求 id 232 之后,待处理请求的数量再次变为 37,但这次它没有重新启动和取消。
幻象可以处理的待处理请求的数量是否有限制?
谢谢!!
注意!笔记!注意!: phantomjs 2 开箱即用。但由于它仍在开发中,因此无法在我的生产设置中使用。有谁知道 1.9.8 和 2.0 之间的更新修复了它吗?我可能会在 1.9.8 的源代码中导入该更改并构建它。
【问题讨论】:
-
有趣...如果您从
page.onNavigationRequested事件处理程序锁定导航 (page.navigationLocked = true;),则会创建屏幕截图但仅包含加载屏幕。我怀疑使用 JavaScript 进行了某种可疑的重定向。 -
@ArtjomB。我认为如果 javascript 发现正在使用非正常浏览器,它会刷新页面。因为我后来发现第一个请求正在重新发送。有什么方法可以让 phantom 100% 模拟普通浏览器?
-
@ArtjomB。更新了问题。请再看看
-
我尝试使用 PhantomJS 1.9.7,它坐了一会儿,然后取消了第一个请求。所以 1.9.8 稍微好一点,它至少做了一些事情。 SlimerJS 的行为方式与 PhantomJS 1.9.7 相同。也许您应该尝试 PhantomJS 2(并从源代码编译它)。
-
@ArtjomB。是的,我认为除了放弃 phantomjs 并尝试 pywebkitgtk 之外,我认为这是唯一的解决方案。感谢您的宝贵时间。
标签: http phantomjs network-security