【问题标题】:Phantomjs not able to open certain URLsPhantomjs 无法打开某些 URL
【发布时间】: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.inhttp://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


【解决方案1】:

参考这个问题。

https://github.com/ariya/phantomjs/issues/10522

这与缺乏对 bind() 的可靠支持有关。 phantomjs 1.9.7 曾尝试解决此问题,但直到 2.0 版才完全解决。

修复正在主分支中工作。您唯一的解决方案似乎是自己编译预发布 2.0 并在发布时升级到官方 2.0。

【讨论】:

  • 这不是绑定问题,因为绑定不会让 PhantomJS 崩溃并且会正确报告绑定错误。
【解决方案2】:

我也遇到了同样的问题,终于知道原因了。

您必须启用磁盘缓存。

phantomjs 的磁盘缓存有一个死锁错误。 通过多次在同一个 url 上工作,我用完了这个错误。 如果删除缓存目录,则一切正常。

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 2021-07-12
    • 2019-02-07
    • 2021-08-29
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    相关资源
    最近更新 更多